隐式明确地访问Nullable<int>
会有什么不同吗?
Nullable<int> x = 10;
Console.WriteLine("Value: {0}", x.Value);
Console.WriteLine("Value: {0}", (int)x);
两者都打印10,但我想知道是否有任何特定的偏好使用一个而不是另一个。
答案 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属性进行检查。