让我们看下面的代码:
class Foo
{
string bar;
public void Method()
{
if (!String.IsNullOrEmpty(this.bar))
{
string bar = "Hello";
Console.Write(bar);
}
}
}
这将编译,一切都很好。但是,现在让我们删除this.
前缀:
class Foo
{
string bar;
public void Method()
{
if (!String.IsNullOrEmpty(bar)) // <-- Removed "this."
{
string bar = "Hello";
Console.Write(bar);
}
}
}
在这种情况下,我得到一个编译器错误。我同意这是一个错误,但是让我感到困惑的是错误的位置。错误发生在线:
string bar = "Hello";
随着消息:
不能在此范围内声明名为“bar”的局部变量,因为它会给“bar”赋予不同的含义,而“bar”已在“父或当前”范围中用于表示其他内容
根据我对编译器的了解,声明bar
被提升到Method()
方法的顶部。但是,如果是这种情况,则该行:
if (!String.IsNullOrEmpty(bar))
应该被认为是模棱两可的,因为bar
可能是对实例字段或尚未声明的局部变量的引用。
this.
对我来说,删除可能会导致另一行的编译错误似乎很奇怪。换句话说,声明一个局部bar
变量是完全有效的,只要之前在范围内没有进行过潜在的模棱两可的引用bar
(注意,如果我注释掉,if (!String.IsNullOrEmpty(bar))
那么错误就会消失)。
这一切似乎都很迂腐,所以你的问题是什么?:
我的问题是为什么编译器允许在范围内声明变量之前对变量进行模棱两可的引用,但随后将声明本身标记为冗余。bar
对in的模棱两可的引用不应该String.IsNullOrEmpty()
是错误的更精确位置吗?在我的示例中,它当然很容易发现,但是当我在野外遇到这个问题时,参考是向上的页面并且更难追踪。