52

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

4

9 回答 9

67

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

于 2008-09-11T13:36:33.017 回答
38

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

于 2008-09-11T13:29:48.027 回答
18

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

bool? myValue = true;
bool hasValue = false;

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

请注意,您不能只做:

if (myValue)
{
  hasValue = true;
}
于 2008-09-11T13:31:10.130 回答
9

我很惊讶还没有人去寻找源代码(C# 规范)。从 §4.1.10 可空类型:

可空类型写作 T?,其中 T 是基础类型。此语法是 System.Nullable<T> 的简写,两种形式可以互换使用。

所以,不,这两种形式没有任何区别。(假设您没有Nullable<T>在您使用的任何命名空间中调用任何其他类型。)

于 2013-01-30T17:28:27.200 回答
6

ANullable<T>是一个结构,由一个T和一个指示T是否有效的位标志组成。ANullable<bool>具有三个可能的值:真、假和空。

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

于 2008-09-11T13:26:42.573 回答
4

Abool是一种值类型,因此它不能包含 NULL 值。如果你用 包装任何值类型Nullable<>,它将赋予它这种能力。此外,对值的访问方法通过附加属性HasValueValue.

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

于 2008-09-11T13:28:26.407 回答
2

不,没有区别。总之:

System.Boolean -> 有效值:真​​、假

bool -> System.Boolean 的别名

Nullable<bool> -> 有效值:真​​、假、空

布尔?-> Nullable<bool> 的别名

希望这可以帮助。

于 2008-09-11T13:36:35.637 回答
1

Null 原语只是包装在 Nullable 中的常规原语。任何相反的表现都只是编译器和语法糖。

于 2008-09-11T13:27:56.987 回答
0

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

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

于 2015-01-07T16:55:39.140 回答