Почему мы не можем получить доступ к базовому свойству вне метода в производном классе? - PullRequest
2 голосов
/ 19 июля 2011

Я сталкивался с этим вопросом :

namespace ClassLibrary3
{
    public class Class1
    {
        public int a { get; set; }
        public int A { get; set; }
    }

    public class test : Class1
    {
        a=1; // error 'ClassLibrary3.Class1.a' is a 'property' but is used like a 'type'
        public void hello()
        {
            a = 10;
        }
    }
}

Марк Гравелл говорит, что "За исключением инициализаторов полей, код должен быть в методе".* Почему производный класс не может получить доступ к свойству вне метода?В чем причина этого?

Ответы [ 3 ]

7 голосов
/ 19 июля 2011

Вы не можете поместить любой код вне метода (кроме инициализаторов полей).

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

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

2 голосов
/ 19 июля 2011

Представьте себе, что то, о чем вы просите, будет теоретически разрешено, и тогда необходимо ответить на один важный вопрос: когда должен выполняться этот код?Один из вариантов - запустить его непосредственно перед запуском конструктора или сразу после него.Но тогда вы могли бы просто поместить код в конструктор (в начале или в конце), не так ли?Почему вы хотите разрешить разбрасывать код конструктора по всему классу?Кроме усложнения разбора и чтения кода, вы ничего не получите.

1 голос
/ 19 июля 2011

Порядок выполнения конструктора C #:

  • Переменные-члены инициализируются значениями по умолчанию для всех классов в иерархии

Затем, начиная с самого производного класса:

  • Инициализаторы переменных выполняются для самого производного типа
  • Цепочка конструктора определяет, какой конструктор базового класса будет называться
  • Базовый класс инициализирован (recurse allэтого:)
  • Тела конструктора в цепочке в этом классе выполняются (обратите внимание, что их может быть больше одного, если они связаны с помощью Foo (): this (...) и т.д.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...