关于c#:使用子范围中使用的变量名称


Using a variable name used in a child scope

本问题已经有最佳答案,请猛点这里访问。

我一直在想为什么在C中不允许使用以前在子范围中使用的变量名。这样地:

1
2
3
4
5
6
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语言中。我相信有很好的理由,但这是什么?


这是C设计师的设计选择。它减少了潜在的模糊性。

您可以在两个地方中的一个地方使用它,在if内部或外部,但是您只能在一个地方定义它。否则,您会得到一个编译器错误,正如您所发现的。


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

1
2
3
4
5
6
7
8
for (int i = 0; i < 10; i++)
{
    int a = i * 2;
}
for (int i = 0; i < 5; i++)
{
    int b = i * 2;
}

综上所述,这些设计决策似乎不一致,或者至少是奇怪的限制性和许可性。


正如AdamCrossland所说,这是一个设计选择——为了确保您(或者更可能的是,您的开发伙伴)不会误解代码。

您经常会看到私有实例成员的前缀是"m_uuu"或"uuuuuvar",以避免混淆。


对于所有概率来说,在任何子作用域中创建的任何变量都将放在stackframe上,并输入moment方法。

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

当然,如果他们愿意的话,他们也可以解决这个问题,所以我想这最终也与设计有关。这样出错的可能性就小了