C# 这两种类型有什么区别吗?和可为空<;类型>;?
在C#中,可为空的原语类型(即C# 这两种类型有什么区别吗?和可为空<;类型>;?,c#,.net,nullable,C#,.net,Nullable,在C#中,可为空的原语类型(即bool?)只是它们对应的nullable类型的别名,还是两者之间存在差异?anullable是一种由T和位标志组成的结构,指示T是否有效。Nullable有三个可能的值:true、false和null 编辑:啊,我忽略了一个事实,即“bool”后面的问号实际上是类型名称的一部分,而不是你在问问题的指示器:)。那么,您的问题的答案是“是的,C#bool?只是Nullable的别名。”Null原语只是包裹在Nullable中的常规原语。任何与此相反的外观都只是编译器和
bool?
)只是它们对应的nullable
类型的别名,还是两者之间存在差异?anullable
是一种由T和位标志组成的结构,指示T是否有效。Nullable
有三个可能的值:true、false和null
编辑:啊,我忽略了一个事实,即“bool”后面的问号实际上是类型名称的一部分,而不是你在问问题的指示器:)。那么,您的问题的答案是“是的,C#
bool?
只是Nullable
的别名。”Null原语只是包裹在Nullable中的常规原语。任何与此相反的外观都只是编译器和语法糖。Abool
是一种值类型,因此它不能包含空值。如果您将任何值类型包装为Nullable
,它将赋予该功能。此外,通过附加属性HasValue
和value
来更改对值的访问方法
但问题是:
Nullable
和bool?
是别名。bool和bool之间没有区别?b=null
和可为null的b=null
。?
只是C#编译器语法糖。要访问bool的值吗?您需要执行以下操作:
bool? myValue = true;
bool hasValue = false;
if (myValue.HasValue && myValue.Value)
{
hasValue = true;
}
注意,你不能只做:
if (myValue)
{
hasValue = true;
}
如果您查看使用的IL,您会发现它们都编译为可为空的
。总之:
System.Boolean->有效值:真、假
bool->System.Boolean的别名
可空->有效值:真、假、空
布尔?->可为空的别名
希望这能有所帮助。我很惊讶还没有人找到源代码(C#spec)。根据§4.1.10可为空的类型:
可为空的类型写为T?,其中T是基础类型。此语法是System.Nullable的缩写,这两种形式可以互换使用
所以,不,这两种形式没有任何区别。(假设在您使用的任何名称空间中都没有任何其他名为Nullable
的类型。)没有区别。请看这里:
“语法T?是Nullable的缩写,其中T是一种值类型。这两种形式是可互换的。”这并没有回答这个问题。是的,我在看到你的答案后意识到了这一点。谢谢嗯,不确定是否要投票,因为它没有回答问题,但它很有用,而且很简洁!;-)好吧,根据乔尔的说法,如果你觉得它有用的话,你应该投上一票——如果它是答案的话,不一定要投。但我要说;)+1,但我会使用不同的名称,以便于阅读!If更愿意改为“If(myValue==true)”。它的工作原理是相同的,因为如果myValue为null,它将为false。应该编辑此问题以澄清基本类型的名称是“bool?”而不是“bool”。下面有很好的答案,但问题不清楚。我有一个关于int?
和Nullable
的类似问题,发现了这个问题(及其答案)非常有帮助。请参考,尽管这是很久以前的评论,但他们可能觉得这个答案与其他答案重复,所以他们会这么做?显然我不是西方最快的枪。所有最重要的答案都在几分钟之内。也许他们不知道IL或ILDasm是什么意思。把它们联系起来?虽然这是真的,但当这两种语言之间存在差异时,这种语言也有一些特殊情况。有关更多详细信息,请参阅(以及此处的链接问题)。