: "Значением по умолчанию типа, допускающего значение 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)?

Ответы на вопрос(5)

Ваш ответ на вопрос