【问题标题】:Why is enum cast on short possible but not boxed generic enum cast?为什么枚举强制转换为短可能但不是盒装的通用枚举强制转换?
【发布时间】:2016-11-03 13:51:16
【问题描述】:

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

当拥有short (Int16) 时,可以将其强制转换为枚举类型。当对通用枚举类型和盒装强制转换 ((T)(object)value) 执行相同操作时,这是无效的转换。

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

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

这是为什么呢?以下(旧)代码运行良好:

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

【问题讨论】:

  • 你确定TEnum的底层类型是int (Int32)吗?如果基础类型是 short (Int16),那么您的初始方法可能会奏效。
  • 它是默认值,所以可能是 int,但我看不出为什么我不应该在我的用例中将其更改为 short
  • 否则,无论底层类型如何,这里还有一些其他丑陋的选项应该可以工作:var enumValue = (TEnum)Enum.ToObject(typeof(TEnum), numericValue);var enumValue = (TEnum)(dynamic)numericValue;
  • 其实我喜欢第一个胜过我的三重演员:D

标签: c# generics enums casting


【解决方案1】:

这是装箱和拆箱的问题。拆箱对象时,只能拆箱到原来装箱的值的类型: https://msdn.microsoft.com/de-de/library/yz2be5wk.aspx

在您的情况下,您将 Int16 装箱到对象:

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

然后您尝试将其拆箱为 Int32(枚举为 Int32),这是不可能的:

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

【讨论】:

  • 谢谢参考,我去看看
  • 稍微更正:枚举可以由任何整数类型支持 (enum E : short { ... })。但是,如果未指定,默认值确实是 int。必须能够将任何旧的Object 转换为任何旧的Enum 的通用代码是相当讨厌的。
  • @Jeroen Mostert:谢谢,这对enum E : short ...很有帮助
猜你喜欢
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多