Конструктор без параметров структуры и инициализаторы полей в C# 10

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

Если вы не объявляете конструктор без параметров явно, тип структуры предоставляет конструктор без параметров, поведение которого выглядит следующим образом:

  • Если тип структуры имеет явные конструкторы экземпляров или не имеет инициализаторов полей, неявный конструктор без параметров создает значение по умолчанию для типа структуры, независимо от инициализаторов полей (…).

  • Если тип структуры не имеет явных конструкторов экземпляров и имеет инициализаторы полей, компилятор синтезирует общедоступный конструктор без параметров, который выполняет инициализацию указанного поля (…).

Следующий код выводит 1:

      struct S {
    public int X = 1;
}

class Program {
    static void Main() { System.Console.WriteLine(new S().X); }
}

Следующий код выводит 0:

      struct S {
    public int X = 1;
    public S(int x) { X = x; }
}

class Program {
    static void Main() { System.Console.WriteLine(new S().X); }
}

Это полностью согласуется с приведенной выше спецификацией, но я считаю это нелогичным, поэтому мой вопрос: ПОЧЕМУ? Почему неявный конструктор без параметров ведет себя по-разному в зависимости от того, существуют ли другие конструкторы экземпляров? Почему он не может всегда учитывать инициализаторы полей, даже если есть другие конструкторы экземпляров?

0 ответов

Другие вопросы по тегам