为什么我会收到错误?

时间:2011-05-18 18:46:04

标签: c#

  

可能重复:
  variable scope in statement blocks

我在c#中有以下代码段,但是无法正常工作

 static void Main(string[] args)
        {
            if (true)
            {
                string name = "test";
            }
            else
            {
                string name = "hello";
            }
            string name = "world";
        }

它给出了一个错误,说'name'已在最后一行声明,但是如果我为'name = "some string"更改它,则表示未声明变量名称。

3 个答案:

答案 0 :(得分:5)

C#中的作用域规则与C不同 - 如果在外部作用域中声明变量名称,则在内部作用域之后声明它是无关紧要的。

您在string name语句之外声明了if变量的事实意味着它在if/else的块中可用。

编译器抱怨,因为您在if/else中声明了具有相同名称的其他变量。

如果从最后一行中删除类型,则变量仅在if/else的内部范围内声明,但在它们之外是未知的,因此“未声明变量名称”错误。

以下编译就好了:

    static void Main(string[] args)
    {
        string name = "world";
        if (true)
        {
            name = "test";
        }
        else
        {
            name = "hello";
        }
    }

这里,变量在外部作用域中声明,因此在内部作用域中可见。你没有在内部范围内重新声明它,所以没有错误。

这是否是你想要的并不清楚你的问题。

答案 1 :(得分:3)

您需要在IF之前声明name变量。

   static void Main(string[] args)
        {
            string name;  
            if (true)  
            {  
                name = "test";  
            }  
            else  
            {  
                name = "hello";  
            }  
            //name = "world";  
        }  

最后一条语句已被注释掉,因为它会放弃您对name语句中变量if所做的任何更改。

答案 2 :(得分:2)

这是正确的。变量阻止同名变量(称为declaration space)的代码部分与可访问变量的区域(scope)不同。

特别是声明空间包含声明变量的整个块。因此,外部块中的name会阻止此块中的任何其他name变量或嵌套块。即在您的示例中,内部name和外部name的声明空间重叠导致编译器错误,因为任何标识符在其声明空间内必须是唯一的。内部和外部name的范围不重叠。并且您不能在其范围之外使用变量。

这是根据规范设计和更正的。

查看Eric Lippert关于declaration spacescope之间差异的博客: http://blogs.msdn.com/b/ericlippert/archive/2009/08/03/what-s-the-difference-part-two-scope-vs-declaration-space-vs-lifetime.aspx

  

命名实体的范围是程序文本的区域,通过其不合格的名称引用该实体是合法的。
  相反,声明空间是程序文本的一个区域,其中不允许两个实体具有相同的名称   简而言之,范围回答了“我在哪里可以使用此名称?”的问题。和声明空间回答问题“这个名称在哪里独特?”