我有一个枚举,Foo:
public enum Foo { Alpha, Bravo, Charlie }
如果我尝试从 boxedint到 a进行以下转换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
这告诉我的是,您可以从 boxedint转换为 enum 但不能转换为 a long,并且您不能从 boxed 转换为int除 an 之外的任何类型的可为空值int?。
顺便说一句,我将intto objectfirst 转换为第一个的原因是我真的想从 anint转换为 generic parameter TValue,如下所示:
var x = (TValue)(object)1;
如果我没有(object),它将无法编译。(有关详细信息,请参阅Eric Lippert的这篇博文。)
问题
为什么可以从盒装转换
int为枚举,但不能转换为可为空的枚举(也不能转换为 along或 along?)?什么是最简单的重写方法,
var x = (TValue)(object)1;以便它编译,在运行时工作,并且是高性能的(假设在运行时TValue被确定为 aFoo?)?