这段代码会产生错误CS0136:
static void Main(string[] args)
{
foreach (var arg in args) Console.WriteLine(arg); // error in this line (arg is underlined red)
string arg = "lol";
Console.WriteLine(arg);
}Error description according to microsoft:
不能在此作用域中声明名为“var”的局部变量,因为它将为“var”赋予不同的含义,后者已在“parent or current/child”作用域中用于表示其他内容。
在本例中,编译器声明foreach循环中的参数arg已经声明。我遇到的问题是,我在foreach循环之后声明了字符串arg,所以它应该可以工作,或者我错过了一些要点。是不是某种重新排列代码顺序的“优化”?
我明白,如果我在foreach循环之前声明它,那将是一个错误。此外,我知道我可以用不同的方式命名它。但我想要理解它。
发布于 2020-05-13 15:52:00
我遇到的问题是,我在foreach循环之后声明了字符串arg,所以它应该可以工作
不,不应该是这样。
局部变量的作用域是声明它的整个块--而不仅仅是从那一点开始。您不能在声明点之前使用它,但它仍然在作用域中。
从C# 5 ECMA Standard 8.7.1节中:
然后(仍在8.7.1中):
在局部变量范围内,在局部变量的局部变量声明符之前的文本位置引用局部变量是编译时错误。
..。
注意:局部变量和局部常量的作用域规则旨在保证表达式上下文中使用的名称在块中的含义始终相同。如果局部变量的作用域仅从其声明扩展到块的末尾,则在上面的示例中,第一个赋值将赋值给实例变量,第二个赋值将赋值给局部变量,如果稍后重新排列块的语句,则可能导致编译时错误。
https://stackoverflow.com/questions/61769045
复制相似问题