【发布时间】:2011-12-09 11:47:50
【问题描述】:
似乎没有办法在您的代码中包含未分配的局部变量或检查它们,因为编译器会吐出Use of unassigned local variable 错误。
为什么编译器在编译时不在这些变量上使用default(T)?
即使值类型更难做,在这种情况下引用类型也可以很容易地初始化为null,对吧?
这是一些测试代码:
public void Test ( )
{
int x;
string s;
if ( x == 5 )
Console.WriteLine ( 5 );
if ( s != null )
Console.WriteLine ( "s" );
}
返回:
Use of unassigned local variable 'x'
Use of unassigned local variable 's'
更新:
对于那些声称这是出于正当理由不允许这样做的人,为什么在班级级别上允许这样做?
public class C
{
public int X;
public string S;
public void Print ( )
{
Console.WriteLine ( X );
Console.WriteLine ( S );
}
}
这段代码编译得很好。
为什么在类级别上可以,但在方法级别上不行?
【问题讨论】:
-
编译器想要编译器想要的。
-
我认为这是一个设计决策,仅此而已,就像 C/C++ 一样。
-
当您忘记初始化引用类型的变量时,您宁愿遇到编译时错误还是(运行时)空指针异常?
-
也许编译器鼓励你使用良好的编码实践。
-
CLR 实际上确实将该变量初始化为默认值(T)。在 vb.net 或 C++/CLI 中可以依赖默认值。但不是在 C# 中,语言设计者选择将其设为“很可能是错误”的错误。就是这样,很多 C 和 C++ 程序员都被它咬得很厉害。
标签: c# .net variables compiler-construction initialization