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