Ответ 1
Из самой страницы документации, на которую вы ссылаетесь,, мой акцент:
Элементы массива сортируются по двоичным значениям констант перечисления (т.е. по величине без знака).
Копаясь в коде CLR (2.0 SSCLI) и получая намного более низкий уровень, чем мне действительно комфортно, похоже, что в конечном счете это происходит потому, что внутренние значения enum хранятся в том, что выглядит так (обратите внимание, что это С++ ):
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;
Как можно видеть, это неподписанные типы, которые содержат фактические значения - поэтому, когда эти значения испускаются для перечисления, естественно, они находятся в неподписанном порядке.