почему класс B выдает ошибку - PullRequest
0 голосов
/ 15 ноября 2010

, пожалуйста, объясните мне, как работает этот код и почему он выдаст ошибку в классе B

public class A
    {
        protected int x;
        static void F(A a, B b) {
            a.x = 1;        // Ok
            b.x = 1;        // Ok
        }
    }
    public class B: A
    {
        static void F(A a, B b) {
            a.x = 1;        // Error, must access through instance of B
            b.x = 1;        // Ok
        }
    }

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

Код в B может получить доступ к защищенной переменной только через выражение, имеющее тип времени компиляции B или некоторый тип, полученный из B. Вот как работает защищенный доступ.

Из раздела 3.5.3 спецификации языка C # 4:

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

1 голос
/ 15 ноября 2010

Ключевое слово protected является модификатором доступа участника.Член protected доступен из класса, в котором он объявлен, и из любого элемента class, полученного из class, объявившего этот элемент.

public class A
    {
        public int x; 
        public static void F(A a, B b)
        {
            a.x = 1; 
            b.x = 1;
        }
    }
    public class B : A
    {
        public static void F(A a, B b)
        {
            a.x = 1; 
            b.x = 1;
        }
    }

Почему я переопределилэто с public модификатором доступа.Модификатор protected имеет ограниченный доступ к наследованию class блоков.

Class A {
 protected int x = 0;
}
Class B : A {
 private void SomeFunc() {
  Console.WriteLine(this.x.ToString()); // This will work!
 }
}

Но если вы попытаетесь получить доступ к x, вы ничего не получите в B.

B b = new B();
b.x; // Got nothing in IntelliSense

Видите, мы получили доступ к x в функции B, но его экземпляр не имеет доступа к x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...