InvalidCastException 尝试从装箱 int 转换为可为 null 的枚举

2023-11-22

我有一个枚举,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) 的博客文章了解详情。)

问题

  1. 为什么可以从盒装转换int到一个枚举,但不到一个可为 null 的枚举(并且不到一个long nor a long?)?

  2. 最简单的重写方法是什么var x = (TValue)(object)1;这样它就可以编译,在运行时工作,并且是高性能的(假设TValue被确定为Foo?在运行时)?


要回答第一个问题,仅当装箱值属于枚举的基础类型时,才可以将装箱值转换为枚举。如果你声明过

enum Foo : byte { ...

您将无法从 boxed int 转换为 Foo。

要回答第二个问题,请尝试

var x = (TValue)Enum.ToObject(typeof(TValue), 1);

不过,这涉及拳击;如果你需要一个不会出现问题的解决方案,那就会更复杂。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

InvalidCastException 尝试从装箱 int 转换为可为 null 的枚举 的相关文章

随机推荐