是双倍还是双重?互换?

时间:2010-02-10 23:43:28

标签: c#

如上所述 - 是否有人知道double是否被隐式转换为double? (可空类型)

编辑:这到底发生了什么?

双d = 5;

一倍? d2 = d为双倍?

4 个答案:

答案 0 :(得分:18)

根据你的标题,它们不可互换。

doubledouble?隐式转换。

double?double进行显式转换。

所有可以为空的值类型都是如此:从TNullable<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?。例如。如果ddouble,那么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; }