С# - Основной вопрос: что такое "?"?

Мне интересно, что означает ? в С#?
Я вижу такие вещи, как: DateTime? или int?. Я полагаю, что это относится к С# 4.0?
Я не могу найти его в Google, потому что я не знаю названия этой вещи.
Проблема в том, что я использую DateTime, и у меня много ошибок при бросании (от DateTime до DateTime?).

Спасибо

Ответы

Ответ 1

Это сокращение для написания Nullable<int> или Nullable<DateTime>. Nullables используются с значениями типов, которые не могут быть нулевыми (они всегда имеют значение).

Это не относится к С# 4, кстати.

Вы можете назначить int? для int, если оно имеет значение, поэтому ваш код должен будет делать такие вещи, как:

int? n = 1;
int i = n ?? default(int); //or whatever makes sense

Также обратите внимание, что a Nullable имеет два свойства: HasValue и Value, которые вы можете использовать, если значение установлено и получить фактическое значение.

Ответ 2

Это означает, что тип с нулевым значением.

Он позволяет назначить нулевое значение для значений типов, таких как int и DateTime. Это очень полезно с такими вещами, как дополнительные поля в базе данных.

Ответ 4

? - тип значения NULL.

Вы можете использовать оператор ?? для его смешивания со значениями типов:

const int DefaultValue = -1;

// get a result that may be an integer, or may be null
int? myval = GetOptionalIdFromDB();

// the value after ?? is used if myval is null
int nonNullable = myval ?? DefaultValue;

Тип с нулевым значением можно сравнить с NULL, поэтому приведенное выше является сокращением для:

if( myval != null ) {
    nonNullable = myval.Value;
} else {
    nonNullable = DefaultValue;
}

Но я предпочитаю ??

Ответ 5

A getcha для поиска: [edit: возможно, это происходит иногда]

// nullable type properties may not initialize as null
private int? foo; // foo = 0

// to be certain, tell them to be null
private int? foo = null;

Ответ 6

Это сокращенный способ объявления реализации универсального класса Nullable<T>, где T - тип значения, не допускающего значения NULL.

So

int? i = null;

совпадает с

Nullable<int> i = null;

Как упоминалось выше, Nullable<T> раскрывает свойство HasValue, поэтому вы можете проверить, имеет ли значение i значение перед его работой.

Интересно отметить: если вы добавили Nullable<int> i = 3; к объекту, вы можете вернуть обратно к int или Nullable<int>, потому что у него было значение перед боксом. Если, однако, вы добавили Nullable<int> i = null; к объекту, вы получите исключение NullReferenceException при возврате в int, но вы можете вернуть его обратно в Nullable<int>.

Ответ 7

Как говорили другие, после имени типа это означает тип с нулевым значением.

? также используется в операторе условия.

int max = x > y ? x : y

Это эквивалентно:

int max;
if( x > y )
{
  max = x;
}
else
{
  max = y;
}