C#范围问题

时间:2010-07-30 15:02:17

标签: c# scope

请考虑以下代码示例:

                         // line #
{                        // 1
                         // 2
    {                    // 3
        double test = 0; // 4
    }                    // 5
                         // 6  
    double test = 0;     // 7
}                        // 8 

这给出了错误

  

名为'test'的局部变量不能在此范围内声明,因为它会给'test'赋予不同的含义,'test'已在'child'范围内用于表示其他内容

但我不明白为什么?外部测试变量从第7行开始,而不是在第2行,所以在第4行声明第二个变量名为test的问题,其中范围以第5行结束?

3 个答案:

答案 0 :(得分:10)

变量的范围在它们声明的中,它们在哪一行并不重要。

阅读C#语言规范中的scopes

来自规范:

  

在local-variable-declaration(Section 8.5.1)中声明的局部变量的范围是声明发生的块。

  

范围可以嵌套,内部范围可以从外部范围重新声明名称的含义。 (但是,这并没有消除3.3节规定的限制,即在嵌套块中,不可能声明一个与封闭块中的局部变量同名的局部变量。)

答案 1 :(得分:3)

这是一个经常被问到的问题;另见:

Lambda variable scope

C# going nuts when I declare variables with the same name as the ones in a lambda

C# variable scoping: 'x' cannot be declared in this scope because it would give a different meaning to 'x'

Variable scope confusion in C#

答案是:更仔细地阅读错误消息。错误消息准确说明了问题所在:不允许您使用相同的简单名称来表示同一块中的两个不同内容。

例如:

class C
{
    int x;
    void M()
    {
        int x;
    }
}

完全合法。请注意,外部x 的范围重叠内部x的范围。在两个范围内具有相同名称的重叠范围是非法。

这不合法:

class C
{
    int x;
    void M()
    {
        Console.WriteLine(x); // this.x
        {
            int x;
        }
    }
}

同样,两个具有x重叠的范围完全合法。非法的是简单名称x在同一个块中使用两个平均两个不同的变量 - 即在M()的外部块中,其中包含 M的内部块。

使用相同简单名称​​ 表示同一块中的两个不同内容的程序令人困惑容易出错,因此< em>非法在C#中。

有关详细信息,请阅读我关于此主题的文章:

http://blogs.msdn.com/b/ericlippert/archive/tags/simple+names/

答案 2 :(得分:0)

+1,我同意你的意见,但这并不是规范的编写方式。它使编写编译器更容易我确定。此外,我认为可以说最好不要这样做,以使代码更容易理解。