可空类型"int?"(包括问号)的默认值是多少?

What is the default value of the nullable type "int?" (including question mark)?

在 C# 中,int? 类型的 class 实例变量的默认值是多少?

例如,在下面的代码中,如果 MyNullableInt 从未被显式赋值,它会有什么值?

class MyClass
{
    public int? MyNullableInt;
}

(似乎答案几乎肯定是 null0,但究竟是哪一个?)

int? 以及任何使用 "type?" 声明的可空类型的默认值是 null.

为什么会这样:

  • int?Nullable<T> (where T is int), a struct. (reference)
  • 类型的语法糖
  • Nullable<T> 类型有一个 bool HasValue member, which when false, makes the Nullable<T> instance "act like" a null value. In particular, the Nullable<T>.Equals method 被覆盖为 return trueNullable<T>HasValue == false 与实际的比较时null 值。
  • C# Language Specification 11.3.4 开始,结构实例的初始默认值是该结构的所有值类型字段设置为其默认值,并且该结构的所有引用类型字段设置为 null
  • C# 中 bool 变量的默认值为 false (reference)。因此,默认 Nullable<T> 实例的 HasValue 属性 是 false;这反过来又使 Nullable<T> 实例本身表现得像 null.
var x = default (int?);
Console.WriteLine("x == {0}", (x == null) ? "null" : x.ToString());

我觉得分享 Nullable<T>.GetValueOrDefault() 方法很重要,该方法在处理使用 Nullable<int> 又名 int? 值的数学计算时特别方便。很多时候你不必检查 HasValue 属性,你可以只用 GetValueOrDefault() 代替。

var defaultValueOfNullableInt = default(int?);
Console.WriteLine("defaultValueOfNullableInt == {0}", (defaultValueOfNullableInt == null) ? "null" : defaultValueOfNullableInt.ToString());

var defaultValueOfInt = default(int);
Console.WriteLine("defaultValueOfInt == {0}", defaultValueOfInt);

Console.WriteLine("defaultValueOfNullableInt.GetValueOrDefault == {0}", defaultValueOfNullableInt.GetValueOrDefault());