5

我试图理解这段代码中的一件事:

Nullable<Int32> x = 5;
Nullable<Int32> y = null;
Console.WriteLine("x: HasValue={0}, Value={1}",  x.HasValue, x.Value);
Console.WriteLine("y: HasValue={0}, Value={1}",  y.HasValue, y.GetValueOrDefault());

输出是:

x: HasValue=True, Value=5
y: HasValue=False, Value=0

null当你传递给时我不明白的事情y,我相信它会调用public static implicit operator Nullable<T>(T value),但是这个方法的定义初始化了一个新的结构传递value,它被分配null但是构造函数方法不检查它是否为空,所以它可以分配default(T)value.

为什么我们甚至可以在这里将 null 分配给 struct 并且它工作正常?

你们能不能让我在这里错过什么?我不明白它是如何绕过null并返回默认值的。

可空代码内部定义:

http://codepaste.net/gtce6d

4

4 回答 4

6

相信它调用公共静态隐式运算符 Nullable(T value)

不,它没有,因为TInt32这种情况下,null它不是Int32. 它只是y保留变量默认值,这意味着对于所有字节都是0. 这会产生一个结构体,该结构体具有一个HasValue返回的false

您不能真正传递null给结构,但 C# 编译器正在为您将其转换为默认初始化。

于 2012-06-03T01:15:20.340 回答
1

new Nullable<T>(value);默认值在由(第 40 行)调用的构造函数中分配

于 2012-06-03T01:05:24.847 回答
1

我的猜测是分配null给可为空的调用默认构造函数。hasValue这是留下来的唯一可能方式false

于 2012-06-03T01:20:19.733 回答
1

ANullable<T>只是一个结构,它有一个布尔字段指示它是否具有值,以及一个字段(如果第一个字段为真)指示该值是什么。实际上不可能将任何结构设置为null, aNullable<T>也不例外。相反,编译器将设置 a的请求Nullable<T>转换null为将“具有值”字段(反映在 property 中HasValue)设置为 false 并将“实际值”字段(反映在 property 中Value)设置为其类型的默认值的请求。

就个人而言,我认为假装Nullable<T>whereHasValue是假的null比有用更令人困惑,但我不是微软。我认为每种Nullable<T>类型都有一个静态属性会更有帮助Nullable<T>.Null(这将相当于default(Nullable<T>),但 的行为Nullable<T>已经充分确立,我怀疑它会改变。

于 2012-06-04T03:12:08.863 回答