gpt4 book ai didi

c# - 为什么负枚举成员最后被 foreach 枚举?

转载 作者:可可西里 更新时间:2023-11-01 09:03:05 25 4
gpt4 key购买 nike

在 C# 中,如果我们定义一个 enum,其中包含一个对应于负值的成员,然后我们迭代该 enum 的值,则负值不会先来,但最后。为什么会这样?在其他语言(C、C++、Ada 等)中,遍历 enum 将为您提供定义它的顺序。

MSDN 有一个很好的example of this behavior :

using System;

enum SignMagnitude { Negative = -1, Zero = 0, Positive = 1 };

public class Example
{
public static void Main()
{
foreach (var value in Enum.GetValues(typeof(SignMagnitude)))
{
Console.WriteLine("{0,3} 0x{0:X8} {1}",
(int) value, ((SignMagnitude) value));
}
}
}

// The example displays the following output:
// 0 0x00000000 Zero
// 1 0x00000001 Positive
// -1 0xFFFFFFFF Negative

最佳答案

来自 the very documentation page you link to ,我的重点:

The elements of the array are sorted by the binary values of the enumeration constants (that is, by their unsigned magnitude).

深入研究 CLR 代码(2.0 SSCLI)并获得比我真正熟悉的低得多的级别,看起来最终这是因为内部枚举值存储在看起来像这样的东西中(注意这是 C++ ):

class EnumEEClass : public EEClass
{
friend class EEClass;

private:

DWORD m_countPlusOne; // biased by 1 so zero can be used as uninit flag
union
{
void *m_values;
BYTE *m_byteValues;
USHORT *m_shortValues;
UINT *m_intValues;
UINT64 *m_longValues;
};
LPCUTF8 *m_names;

可以看出,保存实际值的是 unsigned 类型 - 因此当这些值被发出以进行枚举时,它们自然会按其 unsigned 顺序排列。 p>

关于c# - 为什么负枚举成员最后被 foreach 枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18148653/

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