Есть ли разница между типами?и Nullable<тип>?
Вопрос
В 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 — тип значения.Эти две формы взаимозаменяемы».