Вы когда-либо пытались использовать Convert.ChangeType()
метод для преобразования значения в a Nullable<T>
ввести? Неловко, это бросит InvalidCastException
высказывание "Несуществующего объекта не может быть преобразовано в тип значения".
Попытайтесь выполнить это на своем непосредственном окне: ?System.Convert.ChangeType(null, typeof(int?))
По некоторой неясной причине Nullables считают типами значения. Например, typeof(int?).IsValueType
возвраты true
.
Для меня, с тех пор Nullable<T>
принять null
, это - тип класса, не тип значения. Кто-либо знает, почему это было бы реализованный по-другому?
][]System.Nullable
] технически является структурой, поэтому это тип значения (значение []null[
] для []Nullable
] не совсем то же самое, что нулевая ссылка. Это булевый флаг, обозначающий отсутствие значения)). Однако, он специально обрабатывается во время выполнения, и это делает его неудобным типом значений. Во-первых, он не удовлетворяет ограничению типа [] where T : struct[
] (он также не удовлетворяет [] where T : class[
], как бы то ни было). Во-вторых, он демонстрирует интересное поведение бокса. Боксирование []Nullable
] приведет к:[
]null[
] ссылке, если значение []null[
].[]Боксированное значение типа [], лежащего в основе [], если оно на самом деле содержит значение. То есть, в утверждениях:[
] [][]int? x = 2;
объект y = x;
[
][
]
[][]y[
] не является коробчатым значением []Nullable
]. Это просто коробочное []int[
]. Вы можете распаковать любое упакованное значение типа []T[
] в []Nullable
] (и []T[
], конечно же). Обращение []null[
] со ссылкой на []Nullable
] приводит к получению []null[
] значения (как и следовало ожидать).[
]Эта специальная обработка во время выполнения делает работу типов нуля более похожей на работу []null[
] в типах ссылок.[
Nullable
- это тип значения (это структура, см. в MSDN документации), но есть неявное преобразование из null
в Nullable
без значения (x.HasValue == false
). Существует также неявное преобразование значений типа T
в значения типа Nullable
.
Дополнительно все операторы поднимаются из обычных типов, чтобы работать непосредственно с нулевыми типами.
Вот вид высокого уровня...
Интерфейсы играют большую роль в концепции Скрытие информации .
Они в основном помогают скрыть сведения о реализации класса, так что вызывающий класс не имеет зависимости от этой реализации. Поэтому с помощью интерфейсов можно изменять реализацию без изменения класса вызова. Все это по очереди ограничивает сложность вашего кода и облегчает обслуживание в долгосрочной перспективе.
Когда я впервые начал понимать интерфейсы, они были объяснены мне как «контракт, который предоставляет описание вашего класса». Не уверен, что это поможет вам, но если вы думаете об интерфейсе для автомобиля, вы можете сказать, что он ездит , ломается , и поворачивается . До тех пор, пока я попаду из точки A в пункт B, мне не нужно знать, как реализованы эти функции.
-121--829861- Значение NULL < T >
реализовано как структура, а структуры являются типами значений.