迭代的范围太宽

时间:2012-10-18 17:19:22

标签: c#

  

可能重复:
  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();

2 个答案:

答案 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,则声明范围为向外。有时我也会这样。 :)