Error: Inaccessible due to its protection level

3.6k views Asked by At

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>
3

There are 3 answers

0
L-Four On BEST ANSWER

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.

0
Ricky On

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.

0
user3613916 On

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

In second example you are trying to access b.X 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 b.X happened in B class, which inherits from A, therefore access is allowed by "protected" modifier.