В общем, интереса ради залез в исходники Nullable<T> и увидел вот такое:
public static implicit operator Nullable<T>(T value) {
return new Nullable<T>(value);
}
internal T value;
public Nullable(T value) {
this.value = value;
this.hasValue = true;
}
Я же правильно понимаю, что CLR сама как-то особенно работает с этим типом? Так как иначе я не понимаю, как оно работает в этом случае:
float? nullabe=null
По логике null должен передастся в конструктор и пристроится типу T, который из себя представляет значимый тип => падение.
В данном случае, CLR тут ни при чём, это компилятор видит что ожидается тип Nullable<float> и сам подставляет default-значение вместо null. И особое поведение операторов is/as точно так же реализуется компилятором.
Однако, Nullable<> - и правда особенный для CLR тип. Его особенностью является тот факт, что вы никогда не увидите его упакованную версию:
int? i = 5;
object o = i;
Console.WriteLine(o.GetType()); // System.Int32
int j = (int)o; // работает
Сборка персонального компьютера от Artline: умный выбор для современных пользователей