我有两种方法,它们都正确编译:
public int A() { int i; if(!int.TryParse("0", out i)) { return -1; } // do sth return i; } public int B() { int i; if(true) { return -1; } return i; }
在第二种情况(方法B
)中,编译器足够聪明,可以检测到该变量i
从未被使用过,所以它不会抱怨不分配它.
但是,我有另一个例子(两者的组合)似乎等同于方法B
:
public int C() { int i; if (true || !int.TryParse("0", out i)) { return -1; } return i; }
在VisualStudio 2012(.NET Framework 4.6.01055)下在Windows上进行编译时,会抛出错误:Use of unassigned local variable 'i'
.解决方案是:
i
用任何值初始化,或
使用|
运算符代替||
.
为什么会这样?看起来编译器具有检测无法访问代码的所有必要数据.
附注:示例在单声道4.6.2下的Linux上进行C
编译,并提供有关无法访问的代码的警告.