【发布时间】:2012-03-08 23:47:53
【问题描述】:
C# 在变量作用域方面相当挑剔。它怎么可能接受下面的代码?
class Program
{
int x = 0;
void foo()
{
int x = 0;
x = 1;
Console.WriteLine(x);
}
}
如果你问我,那显然是命名冲突。编译器 (Visual Studio 2010) 仍然接受它。为什么?
【问题讨论】:
-
你可以参考
x和this.x,所以没有问题。 -
其实是一致的。如果您在 void foo() 函数中只有 x=0,那么它将从您之前定义的 x 中获取变量。因为您在方法中有 int x = 0 ,所以您为所有意图实例化了一个新变量。但是如果你在 foo 方法之外查看 x 的值,它仍然是 0,因为你在不同的范围内。
-
如果你不喜欢有一个与类成员同名的局部变量,那么你可以得到 ReSharper 和have it prevent you from doing this。
-
是的,从您的角度来看,这是命名冲突,但这是语言设计者预先确定的解决方案;局部变量优先于实例变量。编译器接受它的原因是因为它在语言定义中是有效的。我怀疑定义优先级的原因是决定如何处理这种情况相当容易和直观。对于其他情况(具有重叠范围的两个局部变量等),情况会更小,并被标记为错误。
-
您可能还会发现Scope vs Declaration Space vs Lifetime 很有趣。