Концептуальная причина ошибки "инициализатор поля не может ссылаться на нестатическое поле, метод или свойство" CS0236

C# не инициализатор поля экземпляра ссылка другое поле. Например, этот код недопустим:

class A
{
 string s1 = "";
 string s2 = s1;
}

потому что "s2" ссылается на "s1".

но почему это не разрешается ?

моей первой мыслью было, что спецификации C# не гарантируйте никакого порядка инициализации, но в соответствии со спецификациями порядок является порядком объявления:

в инициализаторы переменных выполняются в текстовом порядке, в котором они отображаются в объявлении класса.

Итак, если порядок детерминирован, каковы могут быть подводные камни такого рода кода ?

заранее спасибо за вашу помощь.

EDIT:

согласно ответов Hps, 0xA3 и Петр :

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

  • реализация такой функции потребует некоторых ресурсов от команды разработчиков компилятора для небольшой выгоды,

  • невозможно использовать метод или свойства по логическим причинам (спасибо Петр), так по консистенции то же самое верно для полей.

3 ответов


эта статья может ответить на ваш вопрос.

Порядок Выполнения


Я не уверен в поле, но кажется рациональным запретить инициализаторам полей доступ к свойствам или методам. Например:

class A
{
    string s1 = GetString();
    string s2 = this.MyString;
    string s3 = "test";

    public string GetString()
    {
        // this method could use resources that haven't been initialized yet
    }

    public string MyString
    {
        get { return s3; } 
        // this field hasn't been initialized yet 
        // (okay, strings have a default value, but you get the picture)
    }
}

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

помимо ловушки, которая переупорядочивает или переструктурирует ваш код, почему компилятор должен быть излишне сложным. Ресурсы ограничены, и команда компилятора, вероятно, предпочитает работать над функциями с более высоким приоритетом.