Jon*_*eet 18
根据你的头衔,它们不可互换.
有一个隐含的从转换double到double?.
有一个明确的,从转换double?到double.
这同样适用于所有的空值类型真:有一个从隐式转换T到Nullable<T>,并从明确一个Nullable<T>来T.
有趣的是,尽管Nullable<T>确实以正常方式将这些转换提供为用户定义的转换,但MS C#编译器不使用它们 - 它调用Nullable<T>(T value)构造函数进行隐式转换,并Value直接使用属性进行显式转换.
到底发生了什么?
double d = 5;
double? d2 = d as double?;
Run Code Online (Sandbox Code Playgroud)
好吧,让我们来看看吧.
在第一行中,声明一个名为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;
Run Code Online (Sandbox Code Playgroud)
这是通过调用double的构造函数生成的,将d作为参数传递给构造函数,并将对局部变量d2的引用传递为"this".所以这基本上变成了:
double? d2 = new Nullable<double>(d);
Run Code Online (Sandbox Code Playgroud)
这正是那里发生的事情.这一切都有意义吗?
是的,double隐式转换为double?. 例如,如果d是double然后double? nullableD = d;就可以了。
虽然double?没有隐式转换为double. 在这种情况下,您应该使用double d = nullableD.Value;