1

可能重复:
为什么不能在嵌套的局部范围内声明重复的变量名?

我注意到以下代码没有编译。快速修复是将外部变量召回thing到其他东西,但后来我开始思考并意识到内部范围应该foreach循环内结束。我肯定不能在它之外使用内部变量。

我不应该能够在thing循环之外重用名称吗?为什么?

String aggregate = String.Empty;
foreach (Thing thing in things)
  aggregate += thing.Value;

Thing thing = new Thing();
4

2 回答 2

6

我不应该能够在循环之外重用名称吗?为什么?

问题是最后一行中变量的范围向上扩展……它覆盖了整个块。所以问题实际上是你不能为循环thing声明变量,因为它与另一个已经在范围内的变量发生冲突。

从 C# 4 规范的第 8.5.1 节:

local-variable-declaration中声明的局部变量的范围是发生声明的块。在局部变量的局部变量声明之前的文本位置引用局部变量是错误的。在局部变量的范围内,声明另一个同名的局部变量或常量是编译时错误。

最后一句话是您的代码违反的那句话。

只是使用不同的名称。

于 2012-10-18T17:21:04.103 回答
0

事实上,令人惊讶的是,变量的范围比您预期的要宽。试试这个代码。

String aggregate = String.Empty;
foreach (Thing thing in things)
  aggregate += thing.Value;
foreach (Thing thing in things)
  aggregate += thing.Value;

它会编译得很好。但是,如果您thing像之前一样声明外部,则声明跨度为outouts。有时,它也会吸引我。:)

于 2012-10-18T17:28:57.910 回答