: "Значением по умолчанию типа, допускающего значение NULL, является экземпляр, для которого свойство HasValue имеет значение false. Ссылка на свойство Value для значения по умолчанию типа NULL, имеющего значение NULL, приводит к исключению типа System.InvalidOperationException. Значение по умолчанию также известно как нулевое значение типа NULL. Имеется неявное преобразование из нулевого типа (§11.2.7) в любой тип NULL, и это преобразование создает нулевое значение типа. "
ыло интересно, если кто-нибудь знает, как компилятор C # обрабатывает следующее назначение:
int? myInt = null;
Я предполагаю, что выполняется неявное преобразование, но я не могу понять, как обрабатывается нулевое литеральное присваивание. Я демонтировал объект System.Nullable и обнаружил, что неявный оператор переопределяется следующим образом:
public static implicit operator T?(T value) {
return new T?(value);
}
После вызова this попытается запустить вторичный конструктор:
public Nullable(T value) {
this.value = value;
this.hasValue = true;
}
Вот где возникает путаница ... this.value имеет некоторый тип значения и не может быть нулевым.
Итак, кто-нибудь знает, как происходит это "волшебство" ... или я ошибаюсь, предполагая, что вторичный конструктор вызывается? Вызывается ли конструктор по умолчанию, потому что компилятор знает, что он не может сопоставить сигнатуру второго конструктора с литералом null (в результате чего myInt назначается новому «нулевому» Nullable)?