gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:41:38 24 4
gpt4 key购买 nike

我有一个枚举,Foo:

public enum Foo { Alpha, Bravo, Charlie }

如果我尝试从盒装 intFoo? 进行以下转换,我会得到一个 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。)

问题

  1. 为什么可以将装箱的 int 转换为枚举,但不能转换为可为 null 的枚举(而不是 longlong ?)?

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

最佳答案

要回答第一个问题,只有当装箱值是枚举的基础类型时,您才能将装箱值转换为枚举。你声明了吗

enum Foo : byte { ...

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

要回答第二个问题,试试

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

不过,这涉及到拳击;如果您需要一个不会装箱的解决方案,它会更复杂。

关于c# - InvalidCastException 尝试从装箱的 int 转换为可为 null 的枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28351361/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com