2017-01-02 4 views
0

Я увидел вопрос и ответ на переполнение стекаC# Как проверить, является ли объект обнуляемым

How to check if an object is nullable?

Я не мог положить комментарий в выше, потому что я не более 50 комментариев и что вот почему я задаю вопрос здесь.

if(Nullable.GetUnderlyingType(myType) !=null) 
{ 
    // It's Nullable 
} 

Если MyType является System.String

Nullable.GetUnderlyingType(myType) 

возвращает нулевое значение

Я думал System.String нуль-состоянии!

+5

Вы пытались прочитать ответ и весь код, в отличие от копирования строки, которая выглядит релевантной? 'Nullable.GetUnderlyingType()' работает только для типов значений. – CodeCaster

+1

Объект всегда имеет значение NULL, потому что это ссылочное значение –

ответ

2

Звонок Nullable.GetUnderlyingType() ничего не возвращает для typeof(string). documentation упоминает:

Возвращает основной аргумент типа указанного типа обнуляемого.

Возвращаемое значение

Аргумент типа параметра nullableType, если параметр nullableType представляет собой замкнутый общий тип обнуляемого; в противном случае - null.

Другими словами, он возвращает только что-то полезное, если вы на самом деле передать его тип, который реализует Nullable<T>, например int?, bool?, и так далее. Это - это то, что подразумевается под «нулевым типом» здесь.

Вы также можете увидеть его предполагаемое использование в коде из Marc's answer to the question you link to:

static bool IsNullable<T>(T obj) 
{ 
    // ... 
    if (!type.IsValueType) return true; // ref-type 
    if (Nullable.GetUnderlyingType(type) != null) return true; // Nullable<T> 
} 
2

Nullable<T> - это особая структура, поэтому System.string не Nullable<T>, System.string класс. Все классы могут быть пустыми. Так,

if (myType.IsClass) 
{ 
    //can be null 
} 
1

Все ссылочные типы могут быть установлены в нуль, но не от Nullable<T> типа, вы можете проверить, если тип является ссылочным типом, используя !myType.IsValueType

1

System.String (или строка) является ссылочным типом. Это означает, что экземпляры этого типа могут быть null. Nullables - это способ добавить эту функциональность к типам значений (например, примитивные типы bool, int и т. Д.).

1

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 локальному/поле не означает, что это обязательно допустимое значение. В конце концов, решение ваше.