if(true)
{
    string var = "VAR";
}
string var = "New VAR!";
这将导致:
错误1在此范围内无法声明名为"var"的局部变量,因为它会为"var"赋予不同的含义,"var"已在"子"范围中用于表示其他内容.
什么都没有惊天动地,但这不是一般的错误吗?一位开发人员和我想知道第一个声明是否应该在不同的范围内,因此第二个声明不能干扰第一个声明.
为什么C#无法区分这两个范围?第一个IF范围是否应该与方法的其余部分完全分开?
我无法从if外部调用var,因此错误消息是错误的,因为第一个var在第二个范围内没有相关性.
以下代码无法编译声明"在此范围内无法声明名为'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不在范围内,但是不允许我定义一个与子范围内使用的变量同名的新变量(显然是此时的范围).
编译器是否通过拒绝让我使用变量来简单地强制执行范围?如果是这样这是有道理的.
===========
编辑:
我想我也觉得有趣的是你如何在一个方法中的两个子范围内拥有相同的变量,所以这是有效的:
        {
            string thisWorks= string.Empty;
        }
        {
            string thisWorks= "Should this work?";
        }
我只是有点好奇,你可以有两个同名的变量,只要它们处于同一级别(如果你将范围视为树).这是有道理的,因为您可以在具有相同名称的同一类的两个方法中具有局部变量.
我很惊讶编译器能够区分并允许它,而它不允许postParent变量.这是技术限制还是设计决策?这就是我真正想要的;-)