【发布时间】:2017-01-19 13:45:46
【问题描述】:
我有两种方法,它们都编译正确:
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,或者 - 使用
|运算符而不是||。
为什么会这样?看起来编译器拥有所有必要的数据来检测无法访问的代码。
旁注:示例 C 在 mono 4.6.2 下的 Linux 上编译,并按预期发出有关无法访问代码的警告。
【问题讨论】:
-
您是否熟悉停机问题 (en.wikipedia.org/wiki/Halting_problem)?这就是为什么不能总是期望编译器知道您的代码是否无法访问的主要原因......
-
有一个类似这样的老错误,但它涉及dynamic
-
在方法 B 的第一个示例中 - 如果您在 "if (true)" 语句的右大括号之后编写了无效代码,那么尽管没有可访问 - 因此报告使用未分配的局部变量似乎是一种更一致的方法。
-
@Idos 根本不回答这个问题。在这种情况下,编译器可以很清楚地知道
i没有被使用,事实上,这正是它在以后的版本中所做的。 -
@InBetween 重点是总会有编译器无法证明的情况。它会捕捉到一些明显的情况,但你不能指望它总能解决问题,即使在你可以证明给定代码不可达的情况下也是如此。
标签: c#