可能重复:
Why can’t a duplicate variable name be declared in a nested local scope?
我注意到以下代码没有编译。快速解决方法是将外部变量thing
调回其他内容,但后来我开始思考并意识到内部作用域应该在<{strong> foreach
循环中结束。我肯定不能在它之外使用内部变量。
我不应该在循环外重用名称thing
吗?为什么呢?
String aggregate = String.Empty;
foreach (Thing thing in things)
aggregate += thing.Value;
Thing thing = new Thing();
答案 0 :(得分:6)
我不应该在循环外重用名称吗?为什么呢?
问题是最后一行中变量的范围扩展 up ...它覆盖了整个块。所以问题实际上是你不能为循环声明thing
变量,因为它与另一个已经在范围内的变量发生冲突。
来自C#4规范的第8.5.1节:
在 local-variable-declaration 中声明的局部变量的范围是声明发生的块。在局部变量的 local-variable-declaration 之前的文本位置引用局部变量是错误的。在局部变量的范围内,声明另一个具有相同名称的局部变量或常量是编译时错误。
最后一句是你的代码违反的一句话。
只需使用不同的名称。
答案 1 :(得分:0)
事实上,令人惊讶的是,变量的范围比您预期的要宽。试试这段代码。
String aggregate = String.Empty;
foreach (Thing thing in things)
aggregate += thing.Value;
foreach (Thing thing in things)
aggregate += thing.Value;
它编译得很好。但是,如果您在外面声明thing
,则声明范围为向外。有时我也会这样。 :)