8

请参阅以下代码:

string test = "";
int output = -1;

if (int.TryParse(test, out output))
{
    Console.WriteLine("Parsed");
}

Console.WriteLine(output);

失败时TryParse(),不应该跳过块,Console.WriteLine("Parsed")不调用并且值output相同(-1)吗?

它回来了0

4

4 回答 4

15

来自MSDN

当此方法返回时,如果转换成功或转换失败,则包含与字符串中包含的数字等效的 32 位有符号整数值。zero

于 2012-06-13T09:59:27.337 回答
10

的实现TryParse 必须在返回之前默认out参数,否则它将无法编译 -无论out您是否已从调用方初始化参数。任何带有参数的方法都是这种情况,out并不特定于TryParse.

当解析失败时,编码它的人选择将参数默认为零。

重要的部分是你不应该认为任何out参数方法在传入时都会尊重参数的原始值out。事实上,它永远不会尊重参数,因为编译器会报告:

使用未分配的输出参数'blah'

如果您在方法内分配给它之前尝试使用参数值。因此,您实际上可以保证您作为out参数分配和提供的任何值都将被忽略/覆盖。

于 2012-06-13T09:59:33.877 回答
2

如果它失败,它将return false不会执行 if 语句中的代码。

如果转换失败,它也会重新调整0,这就是为什么output=0

于 2012-06-13T09:59:26.380 回答
2

在 C# 中,out必须将参数分配给并且最初不能从中读取。(当方法启动时,out参数被视为未初始化的变量。)

因此,之前的值output是无关紧要的。它必须由编写方法的人覆盖TryParse,否则无法编译。

同时,该TryParse方法无法访问 的先前值output。因此,必须选择一些值。在这种情况下,开发人员选择了0.

于 2012-06-13T10:02:01.753 回答