如上所述 - 是否有人知道double是否被隐式转换为double? (可空类型)
编辑:这到底发生了什么?
双d = 5;
一倍? d2 = d为双倍?
答案 0 :(得分:18)
根据你的标题,它们不可互换。
从double
到double?
的隐式转换。
从double?
到double
进行显式转换。
所有可以为空的值类型都是如此:从T
到Nullable<T>
的隐式转换,以及从Nullable<T>
到T
的显式转换。
有趣的是,尽管Nullable<T>
确实以正常方式将这些转换提供为用户定义的转换,但MS C#编译器不使用它们 - 它调用Nullable<T>(T value)
构造函数进行隐式转换,并且直接使用Value
属性进行显式转换。
答案 1 :(得分:8)
这到底发生了什么?
double d = 5;
double? d2 = d as double?;
好吧,让我们来看看吧。
在第一行中,声明一个名为d的局部变量double类型。您为其分配常量整数5。编译器为您将常量整数5转换为double 5.0,并生成将值赋给本地的代码。
在第二行中,您声明一个名为d2的局部变量double?
表达“d为double?”相当于“d是double??(double?)d :( double?)null”当然除了“d”只被评估一次。
“d为双倍?”的部分被评估为true,因为已知d是double类型。 (当被问到“x是y”时,如果x是非可空类型而y是相应的可空类型,则结果始终为真。)
编译器知道这一点,因此丢弃了替代“(double?)null”。因此生成的代码就好像你说的那样
double? d2 = (double?)d;
这是通过调用double的构造函数生成的,将d作为参数传递给构造函数,并将对局部变量d2的引用传递为“this”。所以这基本上变成了:
double? d2 = new Nullable<double>(d);
那是完全那里发生了什么。这一切都有意义吗?
答案 2 :(得分:3)
是的,double
被隐式强制转换为double?
。例如。如果d
是double
,那么double? nullableD = d;
就可以了。
虽然double?
未隐式强制转换为double
。在这种情况下,您应该使用double d = nullableD.Value;
答案 3 :(得分:3)
您可以按照以下方式
double? d;
d = 12.00
double d2 = (double)d;
在你演员加倍之前要小心吗?可能是null;更好地做这个检查
if(d.HasValue)
{ double d2 = (double)d; }