以下代码无法编译,并指出“无法在此作用域中声明名为“st”的局部变量,因为它会给“st”赋予不同的含义,而“st”已在“子”作用域中用于表示其他内容”:
var l = new List<string>();
l.Find(st => st.EndsWith("12"));
string st = "why this fails?";
我明白为什么这行不通:
string preParent = "";
{
string preParent = "Should fail cause we change the meaning";
}
当我们执行以下操作时,我们得到“CS0103:名称‘postParent’在当前上下文中不存在”:
{
string postParent=string.Empty;
}
postParent = "Should this work?";
我不明白的是,为什么编译器足够聪明,可以看到 postParent 不在作用域内,但不允许我定义一个与子作用域内使用的变量同名的新变量(这显然超出了范围)此时的范围)。
编译器是否通过拒绝让我使用变量来简单地强制作用域?如果是这样,这就有道理了。
===========
Edited:
我想我还觉得有趣的是如何在一个方法的两个子作用域中拥有相同的变量,所以这是有效的:
{
string thisWorks= string.Empty;
}
{
string thisWorks= "Should this work?";
}
我只是有点好奇你可以有两个同名的变量,只要它们位于同一级别(如果你将作用域视为一棵树)。这是有道理的,因为您可以在同一类的两个具有相同名称的方法中使用局部变量。
我只是感到惊讶的是,编译器能够区分并允许这种情况,但它不允许 postParent 变量。这是技术限制还是设计决定?这就是我真正想要达到的目的;-)