考虑以下来源:
static void Main(string[] args)
{
bool test;
Action lambda = () => { test = true; };
lambda();
if (test)
Console.WriteLine("Ok.");
}
它应该编译,对吧?好吧,它没有。我的问题是:根据 C# 标准,这段代码应该编译还是编译器错误?
错误信息:
Use of unassigned local variable 'test'
注意:我知道,如何修复错误,我部分知道,为什么会发生。但是,局部变量是无条件分配的,我猜,编译器应该注意到这一点,但它没有。我想知道为什么。
评论答案:C#允许声明未分配的变量,这实际上非常有用,即。
bool cond1, cond2;
if (someConditions)
{
cond1 = someOtherConditions1;
cond2 = someOtherConditions2;
}
else
{
cond1 = someOtherConditions3;
cond2 = someOtherConditions4;
}
编译器正确编译了这段代码,我认为,不分配变量实际上会使代码更好一点,因为:
- 它告诉读者,值是稍后分配的(很可能在下面的条件语句中)
- 强制程序员在内部条件的所有分支中分配变量(如果从一开始就是这段代码的目的),因为如果其中一个分支没有分配其中之一,编译器将拒绝编译代码。
在边缘:那更有趣。考虑 C++ 中的相同示例:
int main(int argc, char * argv[])
{
bool test;
/* Comment or un-comment this block
auto lambda = [&]() { test = true; };
lambda();
*/
if (test)
printf("Ok.");
return 0;
}
如果您将块注释掉,编译将以警告结束:
main.cpp(12): warning C4700: uninitialized local variable 'test' used
但是,如果您删除注释,编译器不会发出任何警告。在我看来,它能够确定是否设置了变量。