Nullable
тип, а не свойство типа. System.String
является нулевым, но это не Nullable
, в отличие от int?
, что является ярлыком для Nullable<System.Int32>
. Все ссылочные типы в C# являются нулевыми (вы можете передать нулевую ссылку), в то время как тип Nullable
может принимать только тип значения, не равный nullable, в качестве аргумента.
Если вы хотите, чтобы проверить, является ли данный тип может принимать null
как значение, вы можете сделать что-то вроде этого:
bool CanBeNull<T>()
{
return default(T) == null;
}
Конечно, это уже делает предположение о том, что значение по умолчанию является нулевое значение , что не обязательно имеет место; но он будет работать как для ссылочных типов, так и для типов значений Nullable
. Если вам нужно иметь дело с типом значения, который принимает значение null, но не как значение по умолчанию, вам нужно будет его добавить. На самом деле нет надежного и простого способа проверить, может ли заданный тип присвоить значение null, кроме того, что он действительно пытается присвоить нулевое значение.
Действительно, то, что может быть присвоено null, означает то, что очень сильно зависит от компилятора. Например, выполнение чего-то вроде int? someValue = null;
фактически вызывает конструктор int?
- это эквивалентно int? someValue = new int?();
.
Если вы не знаете тип во время компиляции (так что вы не можете использовать дженерики), вы можете добавить проверку для того, данный тип является типом значения:
if (!type.IsValueType) // Can be assigned null
Убедитесь вы правильно относитесь к классам, типам значений и интерфейсам. И, конечно, просто возможность присвоить значение null
локальному/поле не означает, что это обязательно допустимое значение. В конце концов, решение ваше.
Вы пытались прочитать ответ и весь код, в отличие от копирования строки, которая выглядит релевантной? 'Nullable.GetUnderlyingType()' работает только для типов значений. – CodeCaster
Объект всегда имеет значение NULL, потому что это ссылочное значение –