gpt4 book ai didi

c# - 盒装可为空的基础类型可以转换为枚举,但盒装枚举类型不能转换为可为空类型

转载 作者:太空狗 更新时间:2023-10-29 23:23:03 25 4
gpt4 key购买 nike

  • 盒装可为空的基础类型可以转换为枚举,但盒装枚举类型不能转换为可为空类型。

同样,

  • 盒装可为 null 的枚举可以转换到基础类型,但盒装基础类型不能转换为可为 null 的枚举。

好的,我知道“盒装可空类型”并不是描述它的最佳方式,但这是为了解决问题。我知道它是被装箱的基础值类型。

我会用例子来展示它。假设我有一个 enumint 作为基础类型。

enum Sex { Male, Female }

案例一:

int? i = 1;
object o = i;
Sex e = (Sex)o; //success

//but

Sex e = Sex.Male;
object o = e;
int? i = (int?)o; //invalid cast

案例二:

Sex? e = Sex.Male;
object o = e;
int i = (int)o; //success

//but

int i = 1;
object o = i;
Sex? e = (Sex?)o; //invalid cast

简而言之,

(enum)int? -> succeeds
(int?)enum -> the reverse fails

(int)enum? -> succeeds
(enum?)int -> the reverse fails

或者更简单地说,

cast to non-nullable -> succeeds
cast to nullable -> fails

现在我确实知道,一旦您将值类型装箱,它只能被转换回原始类型。但是由于根据 C# 规则,盒装 int 可以转换为 enum 并且盒装 enum 可以转换为 int,以及一个盒装的 intint? 和一个盒装的 int?int,我也在寻求对其他场景(即上面列出的场景)的一致理解。但我不明白逻辑。 一方面,我觉得无论他们都失败了还是都成功了,这对开发人员来说更有意义。 第二,即使是成功的 Actor 阵容看起来也有点奇怪。我的意思是,由于值类型可以隐式转换为它的可为空的等价物(而不是相反),因此转换为可为空的类型无论如何都应该成功,但是在当前的实现中,一个可为空的类型被成功地转换为不可为空的类型,这甚至可以如果前者具有空值,则失败。如果这整个事情是相反的,它会更容易理解。例如:

Sex? e = null;
object o = e;
int i = (int)o; //succeeds, but sure to explode on cast

//but

int i = 1;
object o = i;
Sex? e = (Sex?)o; //invalid cast, even though its always a safe cast

问题:

  1. 那么是什么 C# 规则让这种情况发生了?

  2. 有什么简单的方法可以让我记住这个吗?

最佳答案

我认为这是 unbox 的精妙之处和 unbox.any IL 指令。

来自 ECMA 335,第 III.4.32 节(unbox 操作 - unbox.any 类似)

Exceptions:
System.InvalidCastException is thrown if obj is not a boxed value type, valuetype is a Nullable<T> and obj is not a boxed T, or if the type of the value contained in obj is not verifier-assignable-to (III.1.8.2.3) valuetype.

例如,在这种情况下:

Sex e = Sex.Male;
object o = e;
int? i = (int?)o;

完全正确地失败了 - 因为valuetypeNullable<int> obj 的值不是一个盒装的 int . “verifier-assignable-to”部分不适用于 Nullable<T>案例。

我怀疑 C# 规范中是否描述了任何这种行为,不幸的是 - 我不认为从“盒装 int”到“底层类型为 int 的枚举”的拆箱行为被描述为据我所知,这是在混合中包含可空性的先决条件。

关于c# - 盒装可为空的基础类型可以转换为枚举,但盒装枚举类型不能转换为可为空类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20655473/

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