'。' null可空的运算符

时间:2011-12-05 01:13:24

标签: c# .net compiler-construction null nullable

您如何才能访问 null 可以为空的HasValue? 我查看了编译的代码,它不是语法糖。

为什么这不会抛出NullReferenceException:

int? x = null;
if (x.HasValue)
{...}

2 个答案:

答案 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字段,例如HasValuenull == false

由于Nullable<T>变量是一个结构,因此可以始终引用该变量,因为其内容为null而不是变量本身。

MSDN页面struct的备注部分提供了有关结构的更多信息。