隐式和显式地访问Nullable类型的值

时间:2014-01-03 15:37:33

标签: c#

隐式明确地访问Nullable<int>会有什么不同吗?

    Nullable<int> x = 10;
    Console.WriteLine("Value: {0}", x.Value);
    Console.WriteLine("Value: {0}", (int)x);

两者都打印10,但我想知道是否有任何特定的偏好使用一个而不是另一个。

3 个答案:

答案 0 :(得分:6)

显式强制转换运算符定义如下:

public static explicit operator T(T? value)
{
    return value.Value;
}

实际上,根本没有区别,因为它无论如何都使用Value属性。

在MSDN上也有很好的描述:Nullable Explicit Conversion (Nullable to T)

  

返回值
  输入:T

     

Value 参数的value属性值。

答案 1 :(得分:1)

完全没有区别,两个语句都产生相同的IL代码

IL_0021:  nop
IL_0022:  ldstr      "Value: {0}"
IL_0027:  ldloca.s   x
IL_0029:  call       instance !0 valuetype [mscorlib]System.Nullable`1<int32>::get_Value()
IL_002e:  box        [mscorlib]System.Int32
IL_0033:  call       void [mscorlib]System.Console::WriteLine(string, object)

这是有道理的,因为两者都会调用Value属性(如@MarcinJuraszek所述)。

如果您只是想要一个安全的电话来访问该值,而您对我将使用的null部分不感兴趣:

Console.WriteLine("Value: {0}", x.GetValueOrDefault());

希望这有帮助!

答案 2 :(得分:-1)

Console.WriteLine(“Value:{0}”,(int)X)将unbox x,这意味着如果x为null,它将失败。您可以在可空类型上使用HasValue属性进行检查。