Концептуальная причина «Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство» Ошибка CS0236 - PullRequest
6 голосов
/ 26 ноября 2010

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

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

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

Но почему это недопустимо?

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

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

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

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

РЕДАКТИРОВАТЬ:

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 26 ноября 2010

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

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)
    }
}
4 голосов
/ 26 ноября 2010

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

Порядок исполнения

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

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

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

...