为什么枚举可用于短暂但不是盒装的通用枚举?

时间:2016-11-03 13:51:17

标签: c# generics enums casting

我在转换器中将显式类型代码移植到通用代码时遇到了一个奇怪的限制:

拥有shortInt16)时,可以将其强制转换为枚举类型。使用通用枚举类型和盒装广播((T)(object)value)时,这是无效转换。

我能够通过添加第三个演员来使转换成功。它现在看起来像这样:

Int16 numericValue;
...
var enumValue = (TEnum)(Object)(Int32)numericValue;

为什么?以下(旧)代码工作正常:

Int16 numericValue;
...
var enumValue = (MyEnum)numericValue;    

1 个答案:

答案 0 :(得分:2)

这是装箱和拆箱的问题。当您取消装箱对象时,您只能取消装入最初装箱的值的类型: https://msdn.microsoft.com/de-de/library/yz2be5wk.aspx

在您的情况下,您将Int16打包到对象:

Int16 numericValue;
...
var boxedValue = (object)numericValue;

然后你尝试将它作为Int32(enum是Int32)取消装箱,这是不可能的:

var enumValue = (TEnum)boxedValue; // -> System.InvalidCastException