Конструктор без параметров структуры и инициализаторы полей в 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); }
}
Это полностью согласуется с приведенной выше спецификацией, но я считаю это нелогичным, поэтому мой вопрос: ПОЧЕМУ? Почему неявный конструктор без параметров ведет себя по-разному в зависимости от того, существуют ли другие конструкторы экземпляров? Почему он не может всегда учитывать инициализаторы полей, даже если есть другие конструкторы экземпляров?