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

#c# #protected-resource

#c# #защищенный ресурс

Вопрос:

Это пример из 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>
 

Комментарии:

1. Разве это не объясняется в том же месте, откуда вы получили фрагмент кода?

2. И это там сказано. Это protected защищает переменную от использования только ее собственными и производными классами. class program не является ни тем, ни другим, поэтому вы не можете получить доступ к переменной x из class program . И, таким образом, вы получаете соответствующую ошибку компиляции.

Ответ №1:

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

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

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

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

Ответ №2:

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

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

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

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

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

Ответ №3:

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

Во втором примере вы пытаетесь получить доступ к b.X из класса program, что запрещено модификатором «protected», поскольку класс program не наследует от A.

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