简体   繁体   中英

Error: Inaccessible due to its protection level

This is an example from MSDN which is from the portion explaining 'protected'member access modifier. My question is, why I am getting compile error, if I modifying this program like in Example II,

Example I

class A
{
    protected int x = 123;
}

class B : A
{
    static void Main()
    {
        A a = new A();
        B b = new B();

        b.x = 10;
    }
}

Example II

class A
{
    protected int x = 123;
}

//MODIFICATION IN BELOW 2 LINES
class B : A{}
class program
{
    static void Main()
    {
        A a = new A();
        B b = new B();

        b.x = 10;
    }
}

Compiler Error for Example II :

d:\MyProgs>csc _13protected.cs
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1
Copyright (C) Microsoft Corporation. All rights reserved.

_13protected.cs(14,15): error CS0122: 'A.x' is inaccessible due to its
        protection level
_13protected.cs(3,23): (Location of symbol related to previous error)

d:\MyProgs>

protected means it's not visible outside of the class itself, only in the class itself or derived classes.

In your first example it works because your main method is part of the derived class.

In your second example, your are trying to access a protected member outside of its class, which is not possible. If you want to make this possible, x should be declared public .

See http://msdn.microsoft.com/en-us/library/bcd5672a.aspx for more information about what protected means.

Read the definition of access modifiers and you will get your answer.

public: The type or member can be accessed by any other code in the same assembly or another assembly that references it.

private: The type or member can be accessed only by code in the same class or struct.

protected: The type or member can be accessed only by code in the same class or struct, or in a class that is derived from that class.

internal: The type or member can be accessed by any code in the same assembly, but not from another assembly.

You need to pay attention to actual classes where access to protected field happens.

In second example you are trying to access bX from the program class, which is not allowed by "protected" modifier, as program class doesn't inherit from A.

On the other hand, In first example actuall access to bX happened in B class, which inherits from A, therefore access is allowed by "protected" modifier.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM