Есть ли разница между типами?и Nullable<тип>?

StackOverflow https://stackoverflow.com/questions/56518

  •  09-06-2019
  •  | 
  •  

Вопрос

В C# есть примитивные типы, допускающие значение NULL (т.е. bool?) просто псевдонимы для соответствующих им Nullable<T> типа или есть разница между ними?

Это было полезно?

Решение

Если вы посмотрите на IL, используя Ильдасм, вы обнаружите, что они оба компилируются в Nullable<bool>.

Другие советы

Нет никакой разницы между bool? b = null и Nullable<bool> b = null? это просто сахар синтаксиса компилятора C#.

Чтобы получить доступ к значению bool?вам нужно сделать следующее:

bool? myValue = true;
bool hasValue = false;

if (myValue.HasValue && myValue.Value)
{
  hasValue = true;
}

Обратите внимание, что вы не можете просто сделать:

if (myValue)
{
  hasValue = true;
}

Я удивлен, что никто еще не обратился к исходному коду (спецификации C#).Из §4.1.10 Типы, допускающие значение NULL:

Тип, допускающий значение NULL, обозначается T?, где T — базовый тип.Этот синтаксис является сокращением для System.Nullable<T>, и эти две формы можно использовать как взаимозаменяемые.

Так что нет, между этими двумя формами нет никакой разницы.(Предполагая, что у вас нет другого типа с именем Nullable<T> в любом из используемых вами пространств имен.)

А Nullable<T> представляет собой структуру, состоящую из буквы T и битового флага, указывающего, действительна ли буква T.А Nullable<bool> имеет три возможных значения:истинный, ложный и нулевой.

Редактировать: Ах, я упустил тот факт, что вопросительный знак после «bool» на самом деле был частью имени типа, а не показателем того, что вы задали вопрос :).Тогда ответ на ваш вопрос: «да, C# bool? это просто псевдоним для Nullable<bool>".

А bool является типом значения, поэтому он не может содержать значение NULL.Если вы обернете любой тип значения с помощью Nullable<>, это даст ему эту способность.Более того, методы доступа к значению изменяются дополнительными свойствами. HasValue и Value.

Но на вопрос: Nullable<bool> и bool? являются псевдонимами.

Нет нет никакой разницы.В итоге:

System.Boolean → допустимые значения:правда, ложь

bool -> псевдоним для System.Boolean

Nullable<bool> -> допустимые значения:истина, ложь, ноль

чувак?-> псевдоним для Nullable<bool>

Надеюсь это поможет.

Нулевые примитивы — это обычные примитивы, обернутые в Nullable.Любая видимость обратного — всего лишь компилятор и синтаксический сахар.

Нет разницы.Посмотрите здесь: http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx

«Синтаксис Т?является сокращением от Nullable, где T — тип значения.Эти две формы взаимозаменяемы».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top