与'object'类型一起使用时,扩展转换不隐含?

时间:2013-12-16 07:54:26

标签: c#-4.0

C#MSDN文档指出扩展转换是隐式的,不需要显式转换。因此,我发现以下代码可以正常工作而不会出现任何错误:

public void MyMethod(int x)
{
    float f = x;  //widening conversion, works implicitly as expected.
    ...
}

但是,以下似乎不起作用,即使在我看来这也属于扩大转换的范畴。

public static void MyMethod(int x)
{
        object o = x; // implicit conversion - works.
        float f = (float)o; // implicit conversion expected here also - but doesnt work...
}

在上面的第二段代码中,我希望从存储在'o'中的int数据到显式转换(float)中指定的类型发生隐式转换。但是这没有发生,并且此代码抛出InvalidCastException。为什么会这样?我可以理解当'o'被分配给'f'而没有任何强制转换时抛出的异常。但是如果显式指定了强制转换并且转换为该强制转换需要语言支持的隐式转换(即int to float),为什么会抛出异常?

感谢。

1 个答案:

答案 0 :(得分:3)

演员在不同的时间做不同的事情。这一行:

float f = (float)o;

并未尝试更改o的类型 - 它正在尝试取消float。不幸的是,你只能(在几个wiggles 1 之内)取消装箱所装的相同类型的值 - 装箱的int必须取消装箱为int

你必须这样做:

float f = (int)o;

(int)执行unbox的位置,然后根据您的第一个示例,可以从intfloat进行隐式转换。

如需更多信息,请阅读Boxing and Unboxing

  

Boxing是将值类型转换为类型object或由此值类型实现的任何接口类型的过程。当CLR选择值类型时,它将值包装在System.Object内并将其存储在托管堆上。取消装箱从对象中提取值类型。拳击是隐含的;拆箱是明确的......


1 有一些关于Enum及其基础类型的规则,我不记得也不会刻意使用。

相关问题