Ошибка: недоступна из-за уровня защиты

Это пример из MSDN, который объясняет модификатор доступа "защищенный" элемент. Мой вопрос, почему я получаю ошибку компиляции, если я изменяю эту программу, как в примере II,

Пример I

class A
{
    protected int x = 123;
}

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

        b.x = 10;
    }
}

Пример 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;
    }
}

Ошибка компилятора для примера 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 ответа

Решение

protected означает, что он не виден вне самого класса, только в самом классе или производных классах.

В вашем первом примере это работает, потому что ваш main Метод является частью производного класса.

Во втором примере вы пытаетесь получить доступ к защищенному члену вне его класса, что невозможно. Если вы хотите сделать это возможным, x должен быть объявлен public,

См. http://msdn.microsoft.com/en-us/library/bcd5672a.aspx для получения дополнительной информации о том, что protected средства.

Прочитайте определение модификаторов доступа, и вы получите ответ.

public: тип или член могут быть доступны из любого другого кода в той же сборке или другой сборке, которая ссылается на них.

private: тип или член могут быть доступны только с помощью кода в том же классе или структуре.

protected: доступ к типу или члену возможен только с помощью кода в том же классе или структуре или в классе, производном от этого класса.

внутренняя: к типу или элементу может обращаться любой код из той же сборки, но не из другой сборки.

Вы должны обратить внимание на реальные классы, где происходит доступ к защищенному полю.

Во втором примере вы пытаетесь получить доступ к bX из класса программы, что не допускается модификатором "protected", поскольку класс программы не наследуется от A.

С другой стороны, в первом примере фактически доступ к bX произошел в классе B, который наследуется от A, поэтому доступ разрешен модификатором "protected".

Другие вопросы по тегам