铸造是如何工作的?

Kev*_*vin 6 c# casting

我想知道当你举一个C#时你做object了什么int.

object o = 10;
int i = (int) o;
Run Code Online (Sandbox Code Playgroud)

非常感激 :)!

Mar*_*ell 13

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

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

认为这相当完整?


Jam*_*unt 5

这是装箱和拆箱的示例:

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

C# 正在采用 int 的值类型(可能它是一个局部变量,在寄存器或堆栈中),将它装箱到一个对象中,然后将它放在堆上。当您转换回 int 时,过程会相反。

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