С# - Основной вопрос: что такое "?"?
Мне интересно, что означает ?
в С#?
Я вижу такие вещи, как: 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. Это очень полезно с такими вещами, как дополнительные поля в базе данных.
Ответ 3
Он обозначает типы с нулевым значением.
Я полагаю, что это С#, характерный для С# 4,0?
Он был в С#, так как 2.0
Ответ 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;
}