Ответы:
Это означает, что рассматриваемый тип значения является обнуляемым типом.
Обнуляемые типы являются экземплярами структуры System.Nullable. Обнуляемый тип может представлять правильный диапазон значений для его базового типа значения, а также дополнительное нулевое значение. Например,
Nullable<Int32>
объявленному «Nullable of Int32» может быть присвоено любое значение от -2147483648 до 2147483647, или ему может быть присвоено нулевое значение. ANullable<bool>
может быть присвоено значение true, false или null. Возможность присваивать значение null числовому и логическому типам особенно полезна, когда вы имеете дело с базами данных и другими типами данных, которые содержат элементы, которым может не быть присвоено значение. Например, логическое поле в базе данных может хранить значения true или false, или оно может быть неопределенным.class NullableExample { static void Main() { int? num = null; // Is the HasValue property true? if (num.HasValue) { System.Console.WriteLine("num = " + num.Value); } else { System.Console.WriteLine("num = Null"); } // y is set to zero int y = num.GetValueOrDefault(); // num.Value throws an InvalidOperationException if num.HasValue is false try { y = num.Value; } catch (System.InvalidOperationException e) { System.Console.WriteLine(e.Message); } } }
int
тип и соответствующий Integer
класс, например.
Это сокращение для Nullable<int>
. Nullable<T>
используется, чтобы позволить типу значения быть установленным null
. Типы значений обычно не могут быть нулевыми .
value types
не может быть нулевым. Если вы объявляете int или bool (которые являются типами значений) без специального присваивания значения, они все равно будут иметь значения (0 и false соответственно), т.е. они не будут нулевыми. Неназначенные reference types
, такие как object или MyClass, будут, с другой стороны, равны нулю. Вы можете прочитать разницу между типами значений и ссылочными типами.
В
x ? "yes" : "no"
? объявляет предложение if . Здесь: x представляет логическое условие; Часть до : это предложение then, а часть после это предложение else .
Например, в
int?
? объявляет обнуляемый тип и означает, что тип перед ним может иметь нулевое значение.
return value ? value : "isNull";
говорит мне, что string value
не конвертируется в bool.
Обнуляемые типы являются экземплярами структуры System.Nullable. Обнуляемый тип может представлять нормальный диапазон значений для его базового типа значения, а также дополнительное нулевое значение . Например, [
Nullable<Int32>
], произносится как «Nullable of Int32», может быть присвоено любое значение от -2147483648 до 2147483647, или ему может быть присвоено нулевое значение. [Nullable<bool>
] Можно присвоить значения true, false, или null. Возможность присваивать значение null числовому и логическому типам особенно полезна при работе с базами данных и другими типами данных, содержащими элементы, которым может не быть присвоено значение. Например, логическое поле в базе данных может хранить значения true или false, или оно может быть неопределенным.
он объявляет, что тип обнуляем.
практическое использование:
public string someFunctionThatMayBeCalledWithNullAndReturnsString(int? value)
{
if (value == null)
{
return "bad value";
}
return someFunctionThatHandlesIntAndReturnsString(value);
}
Чтобы добавить к ответам выше, вот пример кода
struct Test
{
int something;
}
struct NullableTest
{
int something;
}
class Example
{
public void Demo()
{
Test t = new Test();
t = null;
NullableTest? t2 = new NullableTest();
t2 = null;
}
}
Это даст ошибку компиляции:
Ошибка 12 Невозможно преобразовать ноль в «тест», потому что это тип значения, не допускающий значения NULL
Обратите внимание, что нет ошибки компиляции для NullableTest. (обратите внимание на? в декларации t2)
int?
это сокращение для Nullable<int>
. Две формы взаимозаменяемы.
Nullable<T>
является оператором, который вы можете использовать с типом значения, T
чтобы заставить его принять null
.
Если вы этого не знаете: типы значений - это типы, которые принимают значения как int
, bool
и char
т. Д.
Они не могут принимать ссылки на значения: они будут генерировать ошибку во время компиляции, если вы назначите им a null
, в отличие от ссылочных типов , которые, очевидно, могут принять это.
Зачем вам это нужно? Потому что иногда ваши переменные типа значения могут получать нулевые ссылки, возвращаемые чем-то, что работает не очень хорошо, например отсутствующей или неопределенной переменной, возвращаемой из базы данных.
Я предлагаю вам прочитать документацию Microsoft, потому что она достаточно хорошо освещает эту тему.