2010-01-13 35 views
14

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

if (true) 
{ 
    int i = 1; 
} 

int i = 2; 

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

A local variable named 'i' cannot be declared in this scope because it would give a different meaning to 'i', which is already used in a 'child' scope to denote something else

可是你不能使用儿童范围内定义任何变量。上面的代码在Java中工作得很好,我也没有看到为什么它不在C#中。我确定有一个很好的理由,但它是什么?

回答

14

这是一个由C#设计人员设计的选择。它减少了潜在的歧义。

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

+0

我其实认为会有一个“真正”的原因,因为我真的不明白为什么会有人做出这样的选择。 :D但是我确实看到了这一点,很高兴知道原因。 – Carlos 2010-01-13 19:21:20

+0

khilon:我真的认为真正的原因是我所建议的;^_^ – Toad 2010-01-13 19:22:46

+1

@Carlos fyi,_real_的原因是所有变量声明都在某个时间点(编译或JIT)移动到其范围的顶部。因此,您的范围与您的声明有关的排序很少,在运行时,子/祖范围冲突永远是冲突。编译器提前拒绝它。 – Gusdor 2014-12-12 12:11:14

0

根据所有可能性,任何子范围中创建的任何变量将在输入方法时置于堆栈框中。

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

他们可以解决此工作过,当然,如果他们想要的东西,所以我想它最终必须做的设计以及..这样有错误

1

正如亚当·克罗斯兰说的机会少,这是一个设计选择 - 确保您(或更有可能的是,您的开发人员)不会误解代码。

你经常会看到一个“M_”或前缀私人实例成员“_”(如_myVar或m_myVar),以避免混淆..

3

东西,我注意到,这不是这里要注意。这编译:

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

总之,这些设计决策似乎不一致,或者至少限制怪异和宽容,分别。

+0

“为什么我可以在同胞作用域中使用相同的变量”应该是注释或其他问题。这篇文章并不是真正的答案,因为这篇文章谈到了兄弟姐妹范围,与原来的问题(子/父范围)不同。 – 2014-11-07 15:13:34

+0

我同意。我试图通过指出与原始问题有关的C#范围问题来增加知识,但不幸的是,由于我的代表太低,我无法将其作为评论发布。 – jeffmk 2014-11-14 02:16:48

+0

我真的看不出什么错,它编译时出了什么问题? – 2016-04-21 08:59:22