Ошибка: недоступна из-за уровня защиты
Это пример из 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".