使用子范围中使用的变量名称

我一直想知道为什么在C#中使用以前在子作用域中使用的变量名是不允许的。 像这样:

if (true) { int i = 1; } int i = 2; 

编译上面的代码会产生错误:

名为“i”的局部变量不能在此范围内声明,因为它会为“i”赋予不同的含义,“i”已在“子”范围中用于表示其他内容

然而,您也不能使用子范围中定义的变量。 上面的代码在Java中运行得很好,我也看不出它在C#中也没有原因。 我确信这是一个很好的理由,但它是什么?

这是C#设计师的设计选择。 它减少了潜在的歧义。

你可以在if或outside之内的两个地方之一使用它,但你只能在一个地方定义它。 否则,您会发现编译器错误。

我注意到的东西在这里没有注意到。 这编译:

 for (int i = 0; i < 10; i++) { int a = i * 2; } for (int i = 0; i < 5; i++) { int b = i * 2; } 

总之,这些设计决策似乎不一致,或者至少是奇怪的限制性和宽容性。

正如Adam Crossland所说,这是一个设计选择 – 确保你(或者更有可能是你的开发人员)不要误解代码。

您经常会看到前缀为“m_”或“_”的私有实例成员(例如_myVar或m_myVar)以避免混淆。

在任何可能的情况下,任何子范围中创建的任何变量都将在输入矩量方法时放在堆栈框架上。

这样,子范围中的类似名称不能与另一个子范围中的变量名共存。

如果他们想要的话,他们当然可以解决这个问题,所以我猜它最终也与设计有关……这样就有更少的错误机会