gpt4 book ai didi

c# - 枚举只命名为整数、类型还是两者都不命名?

转载 作者:太空狗 更新时间:2023-10-29 17:33:06 27 4
gpt4 key购买 nike

在 C# 中使用枚举很有趣。拿一个创建的通用列表来存储您之前定义的一些枚举,并在其中添加一些项目。用 foreach 或 GetEnumerator<T>() 迭代但指定一些其他枚举然后是原始枚举,看看会发生什么。我期待 InvalidCastException 或类似的东西,但它完美地工作:)。

为了便于说明,让我们采用一个简单的控制台应用程序并在其中创建两个枚举:Cars 和 Animals:

    public enum Cars
{
Honda = 0,
Toyota = 1,
Chevrolet = 2
}
public enum Animals
{
Dog = 0,
Cat = 1,
Tiger = 2
}

然后在 main 方法中执行此操作:

    public static void Main()
{
List<Cars> cars = new List<Cars>();
List<Animals> animals = new List<Animals>();
cars.Add(Cars.Chevrolet);
cars.Add(Cars.Honda);
cars.Add(Cars.Toyota);

foreach (Animals isItACar in cars)
{
Console.WriteLine(isItACar.ToString());
}
Console.ReadLine();
}

它将在控制台中打印:

Tiger
Dog
Cat

为什么会这样?我的第一个猜测是枚举本身实际上并不是一个类型它只是和 int 但事实并非如此:如果我们写:

Console.WriteLine(Animals.Tiger.GetType().FullName);我们会印出他的完全合格的名字!那么这是为什么?

最佳答案

枚举类型是不同的,但您对 foreach 中的隐式强制转换感到困惑。

让我们重写一下你的循环:

public static void Main()
{
List<Cars> cars = new List<Cars>();
List<Animals> animals = new List<Animals>();
cars.Add(Cars.Chevrolet);
cars.Add(Cars.Honda);
cars.Add(Cars.Toyota);

foreach (Cars value in cars)
{
// This time the cast is explicit.
Animals isItACar = (Animals) value;
Console.WriteLine(isItACar.ToString());
}
Console.ReadLine();
}

现在结果让你吃惊了吗?希望不会,除非您可以从一个枚举转换为另一个枚举。这只是您的原始代码所做的更明确的版本。

事实上,在每个 foreach 循环中都有一个隐式转换(即使它通常是一个空操作),我认为这是大多数开发人员会感到困惑的一点。

来自 C# 3.0 规范的第 8.8.4 节:

The above steps, if successful, unambiguously produce a collection type C, enumerator type E and element type T. A foreach statement of the form

foreach (V v in x)  embedded-statement 

is then expanded to:

{
E e = ((C)(x)).GetEnumerator();
try {
V v;
while (e.MoveNext()) {
v = (V)(T)e.Current;
embedded-statement
}
}
finally {
... // Dispose e
}
}

枚举转换本身在 6.2.2 节中介绍:

The explicit enumeration conversions are:

  • 从 sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double 或 decimal 到任何枚举类型。
  • 从任何枚举类型到 sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double 或 decimal。
  • 从任何枚举类型到任何其他枚举类型。

An explicit enumeration conversion between two types is processed by treating any participating enum-type as the underlying type of that enum-type, and then performing an implicit or explicit numeric conversion between the resulting types. For example, given an enum-type E with and underlying type of int, a conversion from E to byte is processed as an explicit numeric conversion (§6.2.1) from int to byte, and a conversion from byte to E is processed as an implicit numeric conversion (§6.1.2) from byte to int.

关于c# - 枚举只命名为整数、类型还是两者都不命名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/352177/

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