C# variable scoping not consistent?

后端 未结 7 1550
小蘑菇
小蘑菇 2021-01-05 08:48

C# is quite nit-picking when it comes to variable scoping. How is it possible that it accepts this code:

class Program
{
    int x = 0;

    void foo()
    {         


        
7条回答
  •  逝去的感伤
    2021-01-05 08:55

    The C# 4.0 spec says this about scope hiding through nesting:

    3.7.1.1 Hiding through nesting

    Name hiding through nesting can occur as a result of nesting namespaces or types within namespaces, as a result of nesting types within classes or structs, and as a result of parameter and local variable declarations. In the example

    class A {
        int i = 0;
        void F() {
            int i = 1;
        }
        void G() {
            i = 1;
        }
    }
    

    within the F method, the instance variable i is hidden by the local variable i, but within the G method, i still refers to the instance variable.

    When a name in an inner scope hides a name in an outer scope, it hides all overloaded occurrences of that name.

    In the example

    class Outer {
        static void F(int i) {}
        static void F(string s) {}
        class Inner
        {
            void G() {
                F(1);           // Invokes Outer.Inner.F
                F("Hello");     // Error
            }
            static void F(long l) {}
        }
    }
    

    the call F(1) invokes the F declared in Inner because all outer occurrences of F are hidden by the inner declaration. For the same reason, the call F("Hello") results in a compile-time error.

提交回复
热议问题