C# 是双人还是双人?可互换的?

C# 是双人还是双人?可互换的?,c#,C#,如上所述-有人知道double是否隐式转换为double吗?(可为空类型) 编辑:这里到底发生了什么 双d=5 双份的?d2=d为双精度 是,double隐式转换为double?。例如,如果d是double那么double?nullableD=d很好 虽然double?不会隐式转换为double。在这种情况下,应该使用double d=nullableD.Value根据您的标题,它们不能互换 存在从double到double?的隐式转换 有一个从double?到double的显式转换 对于所有可

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

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

双d=5


双份的?d2=d为双精度

是,
double
隐式转换为
double?
。例如,如果
d
double
那么
double?nullableD=d很好


虽然
double?
不会隐式转换为
double
。在这种情况下,应该使用
double d=nullableD.Value

根据您的标题,它们不能互换

存在从
double
double?
的隐式转换

有一个从
double?
double
的显式转换

对于所有可空值类型也是如此:存在从
T
nullable
的隐式转换,以及从
nullable
T
的显式转换


有趣的是,尽管
Nullable
确实以正常方式将这些转换作为用户定义的转换提供,但MS C#编译器不使用这些转换-它调用
Nullable(t值)
构造函数进行隐式转换,并直接使用
属性进行显式转换,反之亦然

    double? d;
    d = 12.00    
    double d2 = (double)d;
在你扮演替身之前要小心?可以为空;最好做这个检查


这到底是怎么回事

好吧,让我们看一下

在第一行中,您声明了一个名为d的double类型的局部变量。将常量整数5赋给它。编译器会将常量整数5转换为双精度5.0,并生成代码,将该值分配给本地值

在第二行中,您声明了一个名为d2的局部变量,其类型为double

表达式“d为double?”等同于“d为double???(double?)d:(double?)null”,当然,“d”只计算一次

读取“d是double?”的部分计算为true,因为已知d是double类型。(当被问到“x是y”时,如果x是不可为null的类型,而y是相应的可为null的类型,则结果始终为真。)

编译器知道这一点,因此放弃了可选的“(double?)null”。因此,生成的代码就像您所说的

double? d2 = (double?)d;
这是通过调用double?的构造函数,将d作为参数传递给构造函数,并将对局部变量d2的引用作为“This”生成的。因此,这本质上是:

double? d2 = new Nullable<double>(d);
double?d2=新的可为空(d);

这正是那里正在发生的事情。这一切都有意义吗?

您也可以使用强制转换,但如果它为null,它将引发异常。您当然应该在检查nullableD不是null之后才使用nullableD.value。@Paul:除非您对异常感到满意,在这种情况下,只使用value是可以的。@Brian-是的,这是真的,顺便说一句,如果为null,Value也会抛出一个异常,所以同样的行为@Paul-yes,就是这样correct@Perpetualcoder:现在是英国的晚上11点50分-我要睡觉了:)@Jon:在你上床睡觉之前,我已经收集了几百个代表点:)@PerventalCoder:没有代表帽,没有。这个答案没有分数。。。(无论如何,直到午夜之后)。但是商店里的中国老人说“让他远离明亮的光线和水,不管你做什么,午夜之后都不要给飞碟表演。”@Eric:我昨晚差点发了类似的推特,但无法完全正确地获取引号…最好是手动检查该值是否可以为null,而不是由于bug或其他可能导致异常的条件。请参阅以及为什么不在IDE中写入“double?d=1.0;”,并查看它是否编译§6.1.4(隐式可为null的转换):“。对于从不可空值类型
S
转换为不可空值类型
T
的每个预定义隐式标识和数字转换,存在以下隐式可空转换:[……]•从
S
T?
的隐式转换。”。“由于
double
扮演
S
double
扮演
T
(均不可为空)的角色,并注意到根据上述条款,存在从
double
S
)到
double
T
)的隐式转换,从
double
S
)到
double?
T?
)的隐式转换。埃里克:当你这样做时,编译器不会抱怨吗?d2=d;?隐式强制转换调用构造函数是否正常?@ChloeRadshaw:它适用于涉及值类型的转换。将int转换为double,我们将构造一个新的double。当然,double的“构造函数”是IL中的一条指令,但这是一个实现细节。
double? d2 = (double?)d;
double? d2 = new Nullable<double>(d);