System.Convert.ToDouble vs(double)

swc*_*aft 5 c# casting type-conversion

当我(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.
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 18

如果您已经装箱了一个不是双倍的值,那么尝试在一次操作中取消装箱并投射,您将收到一个例外:

int value = 42;
object val = value; // Box

double asDouble = (double)val; // This will raise an exception
Run Code Online (Sandbox Code Playgroud)

有关详细信息,我建议阅读Eric Lippert的文章" 表示和身份",其中详细讨论了这一点.

但是,Convert.ToDouble将检查类型,并处理这种情况,然后将得到的整数值转换为double,没有异常:

int value = 42;
object val = value; // Box

double asDouble = Convert.ToDouble(val); // This will work fine.
Run Code Online (Sandbox Code Playgroud)

这是通过检查对象是否实现IConvertible,以及如果是(doInt32),使用IConvertible.ToDouble,然后使用Int32的ToDouble实现.