您如何才能访问 null 可以为空的HasValue
?
我查看了编译的代码,它不是语法糖。
为什么这不会抛出NullReferenceException:
int? x = null;
if (x.HasValue)
{...}
答案 0 :(得分:11)
这是因为int?
是Nullable<int>
的缩写,{{3}}是值类型,而不是引用类型 - 因此您永远不会得到NullReferenceException
。
Nullable<T>
结构看起来像这样:
public struct Nullable<T> where T : struct
{
private readonly T value;
private readonly bool hasValue;
//..
}
当你指定null
时,编译器会支持一些神奇的事情(它知道Nullable<T>
并以这种方式对它们进行特殊处理),这只会将hasValue
字段设置为false对于此实例 - 然后由HasValue
属性返回。
答案 1 :(得分:1)
与BrokenGlass一样,int?
实际上是Nullable<T>
。
结构始终包含值。通常,您不能将结构变量设置为null,但在这种特殊情况下,您可以将其设置为default(Nullable<T>)
。这将其内容设置为null而不是变量本身。
当您将Nullable<T>
设置为某个值时,它会使用隐式运算符将Value = value
设置为新值HasValue = true
。
当您将Nullable<T>
设置为null时,它会使所有结构的字段为空。对于bool
字段,例如HasValue
,null == false
。
由于Nullable<T>
变量是一个结构,因此可以始终引用该变量,因为其内容为null而不是变量本身。
MSDN页面struct的备注部分提供了有关结构的更多信息。