可空types“int?”(包括问号)的默认值是什么?

在C#中,types为int?的类实例variables的默认值是int?

例如,在下面的代码中,如果MyNullableInt从未明确分配, MyNullableInt具有什么值?

 class MyClass { public int? MyNullableInt; } 

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

int?的默认值int? – 对于使用“type?”的任何可空types 声明 – 为null

为什么是这样的情况:

  • int? 是typesNullable <T> (其中T是int )的结构体的语法糖。 ( 参考 )
  • Nullable<T>types有一个bool HasValue成员,当它为false ,使Nullable<T>实例的行为像一个null值。 特别是, Nullable <T> .Equals方法被覆盖,以便在将HasValue == falseNullable<T>与实际的null值进行比较时返回true
  • 从C#语言规范11.3.4中 ,结构实例的初始默认值是该结构的所有值types字段被设置为其默认值,并且该结构的所有引用types字段都被设置为null
  • C#中boolvariables的默认值是false ( 引用 )。 因此,默认Nullable<T>实例的HasValue属性为false ; 这又使得Nullable<T>实例本身的行为像null

我觉得分享Nullable<T>.GetValueOrDefault()方法非常重要,在使用Nullable<int> aka int?math计算时,这个方法特别方便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()); 

显示上面的代码的命令行工作

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