我有一个枚举,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?
。
顺便说一句,我将int
to object
first 转换为第一个的原因是我真的想从 anint
转换为 generic parameter TValue
,如下所示:
var x = (TValue)(object)1;
如果我没有(object)
,它将无法编译。(有关详细信息,请参阅Eric Lippert的这篇博文。)
问题
为什么可以从盒装转换
int
为枚举,但不能转换为可为空的枚举(也不能转换为 along
或 along?
)?什么是最简单的重写方法,
var x = (TValue)(object)1;
以便它编译,在运行时工作,并且是高性能的(假设在运行时TValue
被确定为 aFoo?
)?