То, почему Nullable <T>, рассмотрело тип значения?

Вы когда-либо пытались использовать Convert.ChangeType() метод для преобразования значения в a Nullable<T> ввести? Неловко, это бросит InvalidCastException высказывание "Несуществующего объекта не может быть преобразовано в тип значения".

Попытайтесь выполнить это на своем непосредственном окне: ?System.Convert.ChangeType(null, typeof(int?))

По некоторой неясной причине Nullables считают типами значения. Например, typeof(int?).IsValueType возвраты true.

Для меня, с тех пор Nullable<T> принять null, это - тип класса, не тип значения. Кто-либо знает, почему это было бы реализованный по-другому?

14
задан jpbochi 8 January 2010 в 21:51
поделиться

3 ответа

[

][]System.Nullable[] технически является структурой, поэтому это тип значения (значение []null[] для []Nullable[] не совсем то же самое, что нулевая ссылка. Это булевый флаг, обозначающий отсутствие значения)). Однако, он специально обрабатывается во время выполнения, и это делает его неудобным типом значений. Во-первых, он не удовлетворяет ограничению типа [] where T : struct[] (он также не удовлетворяет [] where T : class[], как бы то ни было). Во-вторых, он демонстрирует интересное поведение бокса. Боксирование []Nullable[] приведет к:[

] [
    ] [
  • ]A []null[] ссылке, если значение []null[].[
  • ] [
  • ][

    ]Боксированное значение типа [], лежащего в основе [], если оно на самом деле содержит значение. То есть, в утверждениях:[

    ] [
    ][]int? x = 2;
    объект y = x;
    [][
    ] [

    ][]y[] не является коробчатым значением []Nullable[]. Это просто коробочное []int[]. Вы можете распаковать любое упакованное значение типа []T[] в []Nullable[] (и []T[], конечно же). Обращение []null[] со ссылкой на []Nullable[] приводит к получению []null[] значения (как и следовало ожидать).[

    ][
  • ] [
] [

]Эта специальная обработка во время выполнения делает работу типов нуля более похожей на работу []null[] в типах ссылок.[

].
30
ответ дан 1 December 2019 в 06:39
поделиться

Nullable - это тип значения (это структура, см. в MSDN документации), но есть неявное преобразование из null в Nullable без значения (x.HasValue == false). Существует также неявное преобразование значений типа T в значения типа Nullable.

Дополнительно все операторы поднимаются из обычных типов, чтобы работать непосредственно с нулевыми типами.

12
ответ дан 1 December 2019 в 06:39
поделиться

Вот вид высокого уровня...

Интерфейсы играют большую роль в концепции Скрытие информации .

Они в основном помогают скрыть сведения о реализации класса, так что вызывающий класс не имеет зависимости от этой реализации. Поэтому с помощью интерфейсов можно изменять реализацию без изменения класса вызова. Все это по очереди ограничивает сложность вашего кода и облегчает обслуживание в долгосрочной перспективе.

Когда я впервые начал понимать интерфейсы, они были объяснены мне как «контракт, который предоставляет описание вашего класса». Не уверен, что это поможет вам, но если вы думаете об интерфейсе для автомобиля, вы можете сказать, что он ездит , ломается , и поворачивается . До тех пор, пока я попаду из точки A в пункт B, мне не нужно знать, как реализованы эти функции.

-121--829861-

Значение NULL < T > реализовано как структура, а структуры являются типами значений.

1
ответ дан 1 December 2019 в 06:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: