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

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

例如,在下面的代码中,如果从未显式分配 MyNullableInt,它将具有什么值?

class MyClass
{
public int? MyNullableInt;
}

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

91083 次浏览

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

为什么会这样:

  • int?可空 < T > 型(其中 T 是 int)的句法糖,是一种结构(参考文献)
  • Nullable<T>类型有一个 Bool HasValue成员,当 false时,使 Nullable<T>实例“像”一个 null值。特别是,当使用 HasValue == falseNullable<T>与实际的 null值进行比较时,将重写 可空 < T > 等于方法以返回 true
  • C # 语言规范11.3.4开始,struct 实例的初始默认值是将该结构的所有值类型字段设置为它们的默认值,并将该结构的所有引用类型字段设置为 null
  • C # 中 bool变量的默认值是 false(参考文献)。因此,默认 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());

Command line showing the code above working