Nullable- это больше, чем структура?

92
02 сентября 2021, 16:10

В общем, интереса ради залез в исходники 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, который из себя представляет значимый тип => падение.

Answer 1

В данном случае, 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; // работает
READ ALSO
Асинхронное заполнение ObservableCollection

Асинхронное заполнение ObservableCollection

Стоит задача : при инициализации выполняется заполнение ObservableCollection данными, где имеется трудоемкий метод

220
Наследование + event broadcasting

Наследование + event broadcasting

Заранее прошу прощения за невнятный заголовок, не придумал как лучше объяснить

87
The application exited with code: 255

The application exited with code: 255

При попытке запуска какой-либо программы через VS выдает такую ошибкуРаньше этого не было, но после обновления ОС на Mac'е началось

115