System.Convert.ToDouble vs (double)

本文关键字:double vs Convert ToDouble System | 更新日期: 2023-09-27 18:17:52

当我使用(double)value通过将其更改为System.Convert.ToDouble(value)来修复异常错误时,我感到惊讶。

值为对象类型。

谁能告诉我为什么?

在这里,我附上代码和错误消息:

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
    return (double)value * (double)parameter;
}
Error Message: System.InvalidCastException: Specified cast is not valid.

System.Convert.ToDouble vs (double)

如果您已将不是双精度值的值装箱,然后尝试在一个操作中取消装箱和强制转换,您将收到异常:

int value = 42;
object val = value; // Box
double asDouble = (double)val; // This will raise an exception

有关详细信息,我建议您阅读Eric Lippert的文章Representationand Identity,其中详细讨论了这个问题。

但是,Convert.ToDouble 将检查类型并处理这种情况,然后将生成的整数值转换为双精度值,而不会出现异常:

int value = 42;
object val = value; // Box
double asDouble = Convert.ToDouble(val); // This will work fine.

这通过检查对象是否实现 IConvertible 来工作,如果是(Int32 实现(,则使用 IConvertible.ToDouble ,而 又使用 Int32 的 ToDouble 实现。