更新答案:
在最新版本的 C# 中,您可以声明输出参数 inline,这允许您删除示例中不需要的代码行:
string value = Console.ReadLine(); //Get a value from the user.
if (int.TryParse(value, out int num))
{
Console.WriteLine("An integer");
}
else
{
Console.WriteLine("Not an integer");
}
您可以简单地忽略代码中的结果,不再有多余的行。你仍然有额外的参数,但是呢?
潜在的“为什么”仍然是相同的,并且不太可能改变。该方法需要返回两件事,一个bool
指示成功,一个指示成功int
时的结果值。(我想不出另一种方式来传达结果,你可以吗?)由于一个方法只能返回一个东西,而自定义结果类型对此似乎有点矫枉过正,所以决定返回bool
并让结果为一个out
参数。一旦做出决定,它就必须在语言的整个过程中保持不变。
“他们”当然可以添加一个不输出int
值的重载。但为什么?为什么要花费精力设计、记录、测试,并且正如我们所看到的那样,永远支持一种没有任何目的的方法,只是为极少数开发人员节省了几次击键?再次,非常不可能。
对于此类功能,当然欢迎您提出更改。我想,如果提案被接受,那将是非常酷的。我怀疑这个会是,但如果你对它充满热情,那么一定要去做。
原答案:
简短的回答是,“因为这就是方法的定义方式。” 也许 C# 语言团队的某个人偶然发现了这个问题,并提供了为什么做出决定的理由,但这在这一点上并没有太大变化。C# 是一种静态编译的语言,方法签名需要匹配,所以它就是这样。
(想象一下,如果他们改变了这一点并破坏.TryParse()
了所有现有的代码库。那将是......糟糕。)
不过,您也许可以在自己的代码中解决这个问题。像扩展方法这样简单的东西可以为您解决问题:
public static bool IsInt(this string s)
{
int x = 0;
return int.TryParse(s, out x);
}
然后在您的代码中,您只需要从字符串值调用该方法:
string value = Console.ReadLine();
if (value.IsInt())
Console.WriteLine("An integer");
else
Console.WriteLine("Not an integer");