Что делает bool? средний тип возврата?

Я видел метод return bool?, знает ли кто-нибудь его значение?

Ответ 1

T? - это ярлык синтаксиса С# для Nullable<T>. Итак, bool? отображается в Nullable<bool>. Таким образом, в вашем случае это структура, которая либо null, либо имеет значение bool.

Если a Nullable<T> - null, то бит отличается от ссылочного типа нулевым. В основном это структура, содержащая базовый тип и логический флаг HasValue. Но и среда выполнения, и язык С# имеют немного магии, чтобы притворяться, что Nullable с HasValue==false действительно является нулевым. Но разница по-прежнему протекает иногда.

Основной тип неявно конвертируется в тип с нулевым значением (boolbool?). Чтобы получить базовый тип из типа с нулевым значением, вы можете либо явно указать ((bool)myNullableBool, либо использовать свойство Value (myNullableBool.Value). Перед этим нужно проверить null, или вы получите исключение, если значение nullable равно null.

Ответ 2

В С# "примитивные" типы не могут содержать нулевое значение:

int blah = null;

Это сделает исключение, потому что 'int' не может содержать нулевое значение.

То же самое с double, float, bool, DateTime...

Это хорошо. Проблема возникает, когда вы используете базы данных. В базе данных вы можете иметь строки, которые могут быть нулевыми, например Age (это int).

Как вы держите эту строку на объекте? Ваш int не может содержать нулевое значение, и строка может иметь значение null.

По этой причине MS создала новую структуру, Nullable, вы можете передать этой структуре "примитивный" тип (или структуру), чтобы сделать его нулевым, например:

Nullable<int> blah = null;

Это не сделает исключение, теперь эта переменная может содержать int и null.

Поскольку Nullable слишком длинный, MS создала какой-то псевдоним: если вы положили '?' после типа он становится нулевым:

int? blah = null;
Nullable<int> blah = null;

Эти две строки ТОЧНО одинаковы, но первая легче читать.

Что-то вроде этого:)

Ответ 3

Любой (no-nonsense 1) тип значения, суффикс с ?, делает его типом с нулевым значением:

  • int? - целое число с нулевым значением
  • bool? имеет значение nullable boolean, которое на самом деле является triple state boolean (true, false и null) - подумайте об этом, когда вам нужно реализовать какое-то поведение в тройном состоянии.
  • ...

Другими словами, тип object не поддерживает определение с нулевым значением как object?, потому что он ссылочный тип и может иметь значение null уже.

Использование в режиме реального времени

Ненасыщенные типы чаще всего используются в отношении базы данных, потому что они действительно упрощают преобразование nullable int/bit/datetime/etc. столбцы для типов CLR. Как в этом примере:

create table Test
(
    Id int identity not null primary key,
    Days int null,
    ExactDate datetime null,
    Selected bit null
)

Это можно легко перевести в POCO:

public class Test
{
    public int Id { get; set; }
    public int? Days { get; set; }
    public DateTime? ExactDate { get; set; }
    public bool? Selected { get; set; }
}

1 no-nonsense относится ко всем типам значений, кроме Nullable<T>, который является типом значения как таковым, но не имеет смысла делать его допустимым еще раз... Избегайте такой глупости... Это не скомпилируется, потому что Nullable<Nullable<int>> i = null; можно интерпретировать двумя способами:

i.HasValue == false
  • i.HasValue == true && i.Value.HasValue == false