Почему поля класса не могут быть var? [дубликат]

На этот вопрос уже есть ответ:

class A
{
    A()
    {
        var x = 5;   // this is allowed
    }

    var _x = 5;   // the compiler is unhappy
}

Думаю, компилятор должен уметь определять тип переменной-члена точно так же, как он это делает для локальной. Так в чем разница?

24
задан Backwards_Dave 9 September 2019 в 05:10
поделиться

2 ответа

Это предположение, но инициализация полей уровня класса должна выполняться как часть процесса инициализации (конструктора) для Type, тогда как инициализация переменной уровня метода происходит при построении стекового фрейма метода. Возможно, различие связано с тем, как эти процессы компилируются (как создается их реализация) внутри фреймворка.

0
ответ дан 28 November 2019 в 23:54
поделиться

Я вижу две причины:

  1. Возможно, было бы желательно сделать объявление типов в общедоступном интерфейсе явным
  2. Это сложно реализовать. Компилятор C # компилируется в несколько этапов.
    Сначала он анализирует все, кроме тел методов, поэтому он знает обо всем, что находится за пределами функциональных тел. Затем он может использовать эту информацию для индивидуальной компиляции тел методов. То, что происходит при компиляции одного тела метода, мало влияет на то, что происходит при компиляции других тел метода.
    Если бы вы могли использовать var для полей, тело выражения инициализатора поля будет влиять на тип поля и, следовательно, на многие другие методы. Так что он не очень хорошо подходит для дизайна компилятора.
2
ответ дан 28 November 2019 в 23:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: