#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».