【发布时间】: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