C#值类型转换:它是如何工作的?

bon*_*nfo 5 .net c# casting value-type

可能重复:
为什么这种转换不起作用?

嗨,我发现了一个奇怪的框架行为.此代码抛出异常:

    byte a = 1;
    object b = a;
    Console.WriteLine(b.GetType());
    Console.WriteLine((byte)b);
    Console.WriteLine((int)(byte)b);
    Console.WriteLine(Convert.ToInt32(b));
    Console.WriteLine((int)b);
Run Code Online (Sandbox Code Playgroud)

最后一行抛出System.InvalidCastException.
我想知道框架中使这段代码非法的机制是什么.
这是装箱/拆箱的问题吗?!

Luk*_*keH 7

是的,盒装值类型只能拆箱到完全相同的类型.

该变量b是盒装的byte.

  • 当你(int)(byte)b取消装箱b回到a byte然后将未装箱byte转换为int.
  • 当你这样做时,(int)b你试图b直接拆箱int,这是非法的.

编辑...

正如Jon在他的回答中提到的那样,有些情况下你不必将unbox打包成完全相同的类型.特别:

  • 盒装T可以取消装箱Nullable<T>.
  • 盒装Nullable<T>可以拆箱到T,假设为空的实际上不是null.
  • enum装有底层类型的盒子T可以取消装箱T.
  • 盒装T可以取消装箱到enum底层类型T.

  • 不完全*相同类型.有关拆箱到其他类型的示例,请参阅我的答案. (2认同)

Max*_*kin 5

Eric Lippert有一篇博文.

为什么?因为盒装T只能拆箱到T.

或者Nullable <T>.