gpt4 book ai didi

c# - C# 中不一致的枚举转换结果

转载 作者:行者123 更新时间:2023-11-30 13:55:26 24 4
gpt4 key购买 nike

我最近重新审视了一些 C# 的奇怪行为,这些行为与将整数转换为现有枚举有关,其中一些枚举整数值是显式分配的,一些是按顺序分配的。使用 LinqPad 4,我构建了以下枚举:

public enum Hurf {
Foo,
Bar,
Derp,
Duh = 2,
Lerp,
Mur,
Dur = 3
}

在 C# 程序模式下使用以下主 block 主体,我执行以下转换:

Console.WriteLine((Hurf)2);
Console.WriteLine((int)Hurf.Derp);

Console.WriteLine((Hurf)3);
Console.WriteLine((int)Hurf.Lerp);

这会产生以下输出:

Derp
2
Dur
3

奇怪,在第一个类型转换中,由于有两个项目的整数值为 2,因此它默认为第一个,即“Derp”。按照相同的逻辑,我使用整数值 3 执行了另一个转换,这次它产生了 SECOND 值 3,即“Dur”。

我决定在“Dur”正下方的枚举底部添加另一个项目作为“Test”并将其设置为 0。

public enum Hurf {
Foo,
Bar,
Derp,
Duh = 2,
Lerp,
Mur,
Dur = 3,
Test = 0
}

这不会改变第一次转换的行为,但现在第二次转换的结果是“Lerp”,这与它转换为枚举中设置的第一个值 3 是一致的。

Duh
2
Lerp
3

出于显而易见的原因,我一开始不会依赖这种类型的强制转换,但很高兴知道为什么存在这种行为并受到枚举列表底部任意手动分配的影响。 (此外,将“测试”设置为大于 3 的值会导致返回原始行为。)

最佳答案

问题不在于转换——而是转换为字符串表示形式。 LerpDur 是相同的值 - 您无法区分它们。

确实,如果您直接对它们调用 ToString(),如下所示:

Console.WriteLine(Hurf.Lerp.ToString());
Console.WriteLine(Hurf.Dur.ToString());

...您应该会看到相同的输出两次。它只是没有明确定义您将获得哪些输出。

documentation for Enum.ToString()明确指出:

If multiple enumeration members have the same underlying value and you attempt to retrieve the string representation of an enumeration member's name based on its underlying value, your code should not make any assumptions about which name the method will return.

关于c# - C# 中不一致的枚举转换结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34715848/

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