为什么对短可能的枚举进行强制转换,而不是对盒装泛型枚举进行强制转换

本文关键字:转换 枚举 盒装 泛型 为什么 | 更新日期: 2023-09-27 18:16:04

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

当具有short (Int16)时,可以将其强制转换为enum类型。当对泛型枚举类型和装箱强制转换((T)(object)value)做同样的事情时,这是一个无效的转换。

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

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

为什么?下面的(旧的)代码工作得很好:

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

为什么对短可能的枚举进行强制转换,而不是对盒装泛型枚举进行强制转换

这是一个装箱和拆箱的问题。当你解装箱对象时,你只能解装箱到最初被装箱的值的类型: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