Зачем использовать Nullable, если тип уже может быть присвоен Null? - PullRequest
0 голосов
/ 02 марта 2010

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

В библиотеке была функция, определенная как

public DateTime? GetDate(){..}

Какой смысл в этом? Почему бы просто не сделать его обычным DateTime и вернуть null как обычно, если при получении даты произошла ошибка? Я что-то упускаю из типов Nullable?

Ответы [ 6 ]

10 голосов
/ 02 марта 2010

Поскольку DateTime является типом значения .NET. Так же, как int и char, он не может быть нулевым

1 голос
/ 02 марта 2010

DateTime является типом значения. Ему не может быть присвоено нулевое значение.

Изменить: Если вы пытаетесь использовать? Оператор на ссылочном типе, вы получаете следующую ошибку:

Тип 'объект' должен быть типом значения, не допускающим значения NULL, чтобы использовать его в качестве параметра 'T' в универсальном типе или методе 'System.Nullable'

0 голосов
/ 03 марта 2010

"Почему бы просто не сделать его обычным DateTime и вернуть null"

DateTime не может быть нулевым.

0 голосов
/ 02 марта 2010

Не все типы являются ссылочными типами. Например, вы не можете сделать что-то вроде

int x = null;

потому что int является типом значения. DateTime является типом значения.

0 голосов
/ 02 марта 2010

DateTime является структурой и, следовательно, допустимым значением NULL, потому что это тип значения. Но вы правы, нельзя сделать ссылочные типы обнуляемыми, потому что им уже может быть присвоен ноль.

0 голосов
/ 02 марта 2010

Типы значений не могут быть нулевыми. Nullable (часто пишется DateTime?) может иметь значение null. Это также верно для всех типов значений. Если вы хотите, чтобы переменная содержала допустимое целое или пустое значение, вам нужно объявить тип значения Int32?

Вы не можете иметь Nullable строку. Я упоминаю об этом, потому что, хотя строки являются ссылочными типами, они ведут себя как типы значений во многих отношениях; Я пытался объявить Nullable. (Хорошо, я признаю это. Это был я.)

...