【发布时间】:2012-09-05 23:44:24
【问题描述】:
我有一个枚举,Foo:
public enum Foo { Alpha, Bravo, Charlie }
如果我尝试从框选的int 到Foo? 进行以下转换,我会得到InvalidCastException:
var x = (Foo?)(object)1;
这让我做了一些实验......
var x = (Foo)(object)1; // succeeds
var x = (long)(object)1; // fails
var x = (long?)(object)1; // fails
var x = (long)1; // succeeds
var x = (long?)1; // succeeds
var x = (int)(object)1; // succeeds
var x = (int?)(object)1; // succeeds
这告诉我的是,您可以从装箱的 int 转换为枚举,但不能转换为 long,并且您不能从装箱的 int 转换为任何类型的除了 int? 之外可以为空。
顺便说一句,我首先将int 转换为object 的原因是我真的想从int 转换为通用参数TValue,如下所示:
var x = (TValue)(object)1;
如果我没有(object),它将无法编译。 (详情请参阅blog post by Eric Lippert。)
问题
为什么你可以从一个装箱的
int转换为一个枚举,而不是一个可以为空的枚举(而不是一个long也不是一个long?)?-
重写
李>var x = (TValue)(object)1;以使其编译、在运行时工作并具有高性能的最简单方法是什么(假设TValue在运行时被确定为Foo?)?
【问题讨论】:
标签: c# generics casting enums nullable