在 C# 中,可为空的原始类型(即bool?
)只是它们相应Nullable<T>
类型的别名,还是两者之间有区别?
9 回答
如果您使用Ildasm查看 IL ,您会发现它们都编译为Nullable<bool>
.
bool? b = null
和之间没有区别Nullable<bool> b = null
。这?
只是 C# 编译器语法糖。
访问布尔值?您需要执行以下操作:
bool? myValue = true;
bool hasValue = false;
if (myValue.HasValue && myValue.Value)
{
hasValue = true;
}
请注意,您不能只做:
if (myValue)
{
hasValue = true;
}
我很惊讶还没有人去寻找源代码(C# 规范)。从 §4.1.10 可空类型:
可空类型写作 T?,其中 T 是基础类型。此语法是 System.Nullable<T> 的简写,两种形式可以互换使用。
所以,不,这两种形式没有任何区别。(假设您没有Nullable<T>
在您使用的任何命名空间中调用任何其他类型。)
ANullable<T>
是一个结构,由一个T和一个指示T是否有效的位标志组成。ANullable<bool>
具有三个可能的值:真、假和空。
编辑:啊,我错过了这样一个事实,即“bool”之后的问号实际上是类型名称的一部分,而不是您提出问题的指示:)。那么,您的问题的答案是“是的,C#bool?
只是Nullable<bool>
”的别名。
Abool
是一种值类型,因此它不能包含 NULL 值。如果你用 包装任何值类型Nullable<>
,它将赋予它这种能力。此外,对值的访问方法通过附加属性HasValue
和Value
.
但问题是:Nullable<bool>
和bool?
是别名。
不,没有区别。总之:
System.Boolean -> 有效值:真、假
bool -> System.Boolean 的别名
Nullable<bool> -> 有效值:真、假、空
布尔?-> Nullable<bool> 的别名
希望这可以帮助。
Null 原语只是包装在 Nullable 中的常规原语。任何相反的表现都只是编译器和语法糖。
没有不同。看看这里:http: //msdn.microsoft.com/en-us/library/1t3y8s4s.aspx
“语法 T? 是 Nullable 的简写,其中 T 是值类型。这两种形式可以互换。”