【问题标题】:Why am I getting error? [duplicate]为什么我会出错? [复制]
【发布时间】:2011-05-18 18:46:04
【问题描述】:

可能重复:
variable scope in statement blocks

我在 c# 中有以下代码 sn-p,但它不起作用

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

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

【问题讨论】:

标签: c#


【解决方案1】:

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

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

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

如果您从最后一行删除类型,则变量仅在 if/else 的内部范围内声明,但在外部范围内不知道,因此出现“未声明变量名”错误。

以下将编译得很好:

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

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

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

【讨论】:

  • @Oded:非常感谢您的回答...
  • 你确定可以编译吗?我认为您不能在声明之前使用名称,即使它在范围内。
  • @Oded,不会编译。在声明之前,您将收到关于使用本地的错误。
  • 不,它不会编译,因为名称不在内部块的范围内。
  • 我认为 OP 知道如何解决该错误,并且对不重叠范围的变量仍然会导致变量重新声明错误感到惊讶。
【解决方案2】:

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

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

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

【讨论】:

  • 但这和他所拥有的不一样,上面他有两个变量局部于各自的 if 块,并且有一个局部于函数。
  • 这不是 c - 也不是他的代码的反映。
  • 如果没有更多上下文,这可能是 OP 想要的,也可能不是......
【解决方案3】:

这样说是对的。变量阻塞同名变量的代码部分(称为declaration space)与可访问的区域(scope)不同。

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

这是设计使然,根据规范正确。

查看 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多