关于c#:类型之间有区别吗?和Nullable <type>?

关于c#:类型之间有区别吗?和Nullable <type>?

Is there any difference between type? and Nullable<type>?

在C#中,可为空的原始类型(即bool?)只是其相应Nullable<T>类型的别名,还是两者之间有区别?


如果使用Ildasm查看IL,则会发现它们都编译为Nullable<bool>


bool? b = nullNullable<bool> b = null之间没有区别。 ?只是C#编译器语法糖。


要访问布尔值?您需要执行以下操作:

1
2
3
4
5
6
7
bool? myValue = true;
bool hasValue = false;

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

请注意,您不能只是这样做:

1
2
3
4
if (myValue)
{
  hasValue = true;
}

令我惊讶的是,到目前为止还没有人找到源代码(C#规范)。从?§4.1.10开始可空类型:

A nullable type is written T?, where T is the underlying type. This syntax is shorthand for System.Nullable< T >, and the two forms can be used interchangeably.

因此,不,两种形式之间没有任何区别。 (假定您在使用的任何命名空间中都没有其他称为Nullable<T>的类型。)


A Nullable<T>是由T和指示T是否有效的位标志组成的结构。 Nullable<bool>具有三个可能的值:true,false和null。

编辑:啊,我错过了一个事实,即" bool"之后的问号实际上是类型名称的一部分,而不是您在问问题的指示符:)。那么,对您的问题的答案是"是的,C#bool?只是Nullable<bool>的别名"。


A bool是值类型,因此它不能包含NULL值。如果用Nullable<>包装任何值类型,它将具有这种能力。此外,通过附加属性HasValueValue

更改对值的访问方法。

但要问的是:Nullable<bool>bool?是别名。


不,没有区别。总结:

System.Boolean->有效值:true,false

bool-> System.Boolean

的别名

可空<布尔>->有效值:true,false,null

布尔? -> Nullable

的别名

希望这会有所帮助。


Null基元只是包装在Nullable中的常规基元。任何与之相反的外观只是编译器和语法糖。


没有区别。在这里看看:http://msdn.microsoft.com/en-us/library/1t3y8s4s.aspx

"语法T?是Nullable的简写,其中T是值类型。这两种形式是可以互换的。"


推荐阅读