为什么不能将Double隐式强制转换为Decimal

我不理解十进制和双精度的转换规则。

这样做是合法的

decimal dec = 10; double doub = (double) dec; 

然而令我困惑的是,十进制是一个16字节的数据类型,double是8个字节,因此不会将一个双倍的十进制数转换为加宽的对话,因此应该隐式允许; 以上例子不允许?

如果从double转换为decimal ,则可能会丢失信息 – 该数字可能完全超出范围,因为double的范围远大于decimal的范围。

如果从decimal转换为double精度,则可能会丢失信息 – 例如,0.1可以用decimal表示,但不能用double精度表示, decimal实际上使用的精度比double精度多得多。

隐式转换不应该丢失信息(从longdouble的转换可能,但这是一个不同的论点)。 如果您要丢失信息,则必须通过显式强制转换告诉编译器您已经知道这一点。

这就是为什么没有隐式转换的原因。

十进制更精确,因此您将丢失信息。 这就是为什么你只能明确地做到这一点。 这是为了保护您免于丢失信息。 请参阅MSDN

http://msdn.microsoft.com/en-us/library/678hzkk9%28v=VS.100%29.aspx

http://msdn.microsoft.com/en-us/library/364x0z75.aspx

您可以在两个方向显式转换:从doubledecimal ,从decimaldouble

您无法隐式转换任何一个方向,原因很简单:转换可能不是无损失。

例如,十进制数1234567890123456789不能完全表示为double。 同样,双数10^32不能精确地表示为十进制数。

为避免无意中丢失信息,不允许隐式转换。