以下代码无法编译,说明“无法在此范围内声明名为 'st' 的局部变量,因为它会给 'st' 赋予不同的含义,后者已在 'child' 范围内用于表示其他内容”:
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 不在范围内,但不会让我定义一个与子范围内使用的变量同名的新变量(这显然不在在这一点上的范围)。
编译器是否通过拒绝让我使用变量来简单地执行范围?如果是这样,这是有道理的。
===========
编辑:
我想我还觉得有趣的是如何在一个方法中在两个子范围内拥有相同的变量,所以这是有效的:
{
string thisWorks= string.Empty;
}
{
string thisWorks= "Should this work?";
}
我只是有点好奇你可以有两个同名的变量,只要它们处于同一级别(如果你将范围视为一棵树)。这是有道理的,因为您可以在同一个类的两个同名方法中使用局部变量。
我很惊讶编译器能够区分并允许这样做,而它不允许 postParent 变量。这是技术限制还是设计决定?这就是我真正想要达到的目的;-)