为什么Int32.TryParse在无法转换时重置out参数?

Car*_*ist 10 c#

如果我运行这个C#代码

int realInt = 3;  
string foo = "bar";  
Int32.TryParse(foo, out realInt); 

Console.WriteLine(realInt);  
Console.Read();
Run Code Online (Sandbox Code Playgroud)

我得到0.我想知道为什么!因为我找不到任何理由.这迫使我为每次解析创建临时变量.所以,请!伟大的宇宙编码器,赐教我!

Mar*_*ell 33

它是"out",而不是"ref".在方法内部,它必须分配它(不先读取它)以满足"out"的含义.

实际上,"out"是一种语言问题(不是框架问题) - 因此托管C++实现可能会忽略这一点......但是遵循它更加一致.

事实上; 如果方法返回false,你就不应该查看该值; 在下次分配之前将其视为垃圾.声明返回0,但这很少有用.


另外 - 如果它没有这样做(即如果它保留了值); 会打印什么:

int i;
int.TryParse("gibber", out i);
Console.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)

这是完全有效的C#...所以它打印什么?

  • 关于*为什么*这样的解释是这样的,你可以断言变量将*always*已经在`TryParse`调用之后的任何代码中设置,即使变量没有在代码中先前初始化(所以编译器在`TryParse`调用之后使用变量时不会抛出错误;尝试对使用`ref`关键字的函数执行相同操作.) (2认同)

gim*_*mel 7

Int32.TryParse方法(String,Int32)doc说:

将数字的字符串表示形式转换为其等效的32位有符号整数.返回值表示转换是否成功.

结果

键入:System.Int32

当此方法返回时,如果转换成功,则包含等效于s中包含的数字的32位有符号整数值,如果转换失败,则包含.如果s参数为空引用(在Visual Basic中为Nothing),格式不正确,或者表示小于MinValue或大于MaxValue的数字,则转换失败.此参数未初始化传递.