Какие типы данных C # могут быть обнуляемыми типами? - PullRequest
9 голосов
/ 14 мая 2010

Может кто-нибудь дать мне список или указать, где я могу найти список типов данных C #, которые могут иметь тип NULL?

Например:

  • Я знаю, что Nullable<int> в порядке
  • Я знаю, что Nullable<byte[]> нет.

Я хотел бы знать, какие типы обнуляются, а какие нет. Кстати, я знаю, что могу проверить это во время выполнения. Однако это для генератора кода, который мы пишем, поэтому у меня нет фактического типа. Я просто знаю, что столбец string или int32 (и т. Д.).

Ответы [ 3 ]

20 голосов
/ 14 мая 2010

Все типы значений (кроме самого Nullable<T>) могут использоваться в обнуляемых типах, т. Е. Во всех типах, производных от System.ValueType (включая также enum s!).

Причина этого в том, что Nullable объявлено примерно так:

struct Nullable<T> where T : struct, new() { … }
2 голосов
/ 14 мая 2010

Тип считается обнуляемым, если ему может быть присвоено значение или ему может быть присвоен ноль, что означает, что тип не имеет значения вообще.Следовательно, обнуляемый тип может выражать значение или что никакого значения не существует.Например, ссылочный тип, такой как String, имеет значение null, в то время как тип значения, такой как Int32, не имеет значения.Тип значения не может быть обнуляемым, потому что у него достаточно возможностей для выражения только значений, подходящих для этого типа;у него нет дополнительной емкости, необходимой для выражения значения null.

Структура Nullable поддерживает использование только типа значения в качестве типа, допускающего значение NULL, поскольку ссылочные типы по конструкции имеют значение NULL.

Класс Nullable обеспечивает дополнительную поддержку структуры Nullable.Класс Nullable поддерживает получение базового типа типа NULL, а также операции сравнения и равенства для пар типов NULL, чей базовый тип значения не поддерживает общие операции сравнения и операции равенства.*

1 голос
/ 14 мая 2010

Это может быть любой тип значения, включая struct, он не может быть ссылочным типом, поскольку он уже по своей природе может иметь значение null.

Да: Int32 двойной DateTime CustomStruct и т.д.

нет

№: строка массив CustomClass и т.д.

Для получения дополнительной информации см. MSDN: http://msdn.microsoft.com/en-us/library/2cf62fcy(v=VS.80).aspx

...