铸造是如何工作的?

时间:2010-11-12 11:54:10

标签: c# casting

我想知道当您将object投射到int时,C#会做什么。

object o = 10;
int i = (int) o;

非常感谢:)!

4 个答案:

答案 0 :(得分:12)

在一般情况下,这是一个棘手的问题; p这取决于确切的情景:

  • (当目标是值类型时)如果源值仅称为object,则它是 unbox 操作,它颠倒了值类型的特殊方式可以存储在对象引用(Unbox / Unbox_Any
  • 如果源类型是Nullable<int>,则评估.Value属性(如果值为空,则可能导致异常)
  • 如果源类型是规范(uintfloat等)中记录的几种内置类型之一,则会发出特定的操作码(可能根本没有)直接在IL(Conv_I4
  • 中执行转换
  • 如果源类型定义了自定义隐式或显式转换运算符(与目标类型匹配),则该运算符调用作为静态方法(Call
  • (在引用类型的情况下)如果它显然不总是不真实(不同的层次结构),则执行引用转换/检查(CastClass
  • 否则编译器将其视为错误

认为相当完整?

答案 1 :(得分:4)

这是装箱和拆箱的一个例子:

http://msdn.microsoft.com/en-us/library/yz2be5wk(VS.80).aspx

C#采用int的值类型(可能是局部变量,在寄存器中或堆栈中),将其装入对象中,并将其放在堆上。当你转回int时,过程就会逆转。

更常见的是,编译器在转换时会创建非常复杂且特定于类型的IL,特别是它必须在运行时确保您之间的类型是兼容的,查找代码中定义的特定转换运算符,处理溢出铸造是一个非常昂贵的过程。

答案 2 :(得分:1)

在这种特殊情况下,它被称为“拆箱”,请检查http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

答案 3 :(得分:0)

请到这里获取有关以下内容的信息:Casting

另外,值得一读:Boxing and Unboxing