我有一个枚举,Foo
:
public enum Foo { Alpha, Bravo, Charlie }
如果我尝试从盒装中进行以下转换int
to 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
这告诉我的是,你可以从盒装的int
到枚举,但不到long
, 你呢cannot从盒装转换int
任何类型的可空值,除了int?
.
顺便说一句,我选角的原因是int
to object
首先是我真的很想从一个int
到通用参数TValue
, 像这样:
var x = (TValue)(object)1;
如果我没有(object)
,它不会编译。 (看这个埃里克·利珀特 (Eric Lippert) 的博客文章了解详情。)
问题
为什么可以从盒装转换int
到一个枚举,但不到一个可为 null 的枚举(并且不到一个long
nor a long?
)?
最简单的重写方法是什么var x = (TValue)(object)1;
这样它就可以编译,在运行时工作,并且是高性能的(假设TValue
被确定为Foo?
在运行时)?
要回答第一个问题,仅当装箱值属于枚举的基础类型时,才可以将装箱值转换为枚举。如果你声明过
enum Foo : byte { ...
您将无法从 boxed int 转换为 Foo。
要回答第二个问题,请尝试
var x = (TValue)Enum.ToObject(typeof(TValue), 1);
不过,这涉及拳击;如果你需要一个不会出现问题的解决方案,那就会更复杂。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)