Enum.GetValues ​​(typeof (....)) не возвращает правильные значения перечисления - PullRequest
6 голосов
/ 17 февраля 2012

Учитывая этот код:

public enum Enum1
{
    ONE,
    TWO
}

public enum Enum2
{
    A,
    B
}

Этот код возвращает ОДИН, ДВА:

foreach (Enum1 e in Enum.GetValues(typeof(Enum1)))
{
  Console.WriteLine(e);
}

Но этот код, вместо сбоя (поскольку Enum2 e используется с typeof(Enum1)), возвращает A, B:

foreach (Enum2 e in Enum.GetValues(typeof(Enum1)))
{
    Console.WriteLine(e);
}

Почему это?

Ответы [ 7 ]

9 голосов
/ 17 февраля 2012

Потому что под прикрытием Enums - просто целые числа - вторая возвращает значения Enum1, но на самом деле эти значения - просто 0 и 1. Когда вы приводите эти значения к типу Enum2, они все еще действительны и соответствуют значениям «A» и «B».

8 голосов
/ 17 февраля 2012

Поскольку значения ваших перечислений неявно целые:

public enum Enum1
{
    ONE = 0,
    TWO = 1
}

public enum Enum2
{
    A = 0,
    B = 1
}

Значения Enum1 неявно преобразуются в целые числа, а затем в значения Enum2. Если вы переопределили Enum1 следующим образом ...

public enum Enum1
{
    ONE = 0,
    TWO = 1,
    THREE = 2,
}

... тогда не получится не вернет "A, B", потому что в Enum2 нет значения для целочисленного значения 2

3 голосов
/ 17 февраля 2012

Когда вы используете Enum.GetValues(), он возвращает базовые значения.Когда вы используете foreach(Type...), выполняется приведение к типу enum.Таким образом, хотя они могут не совпадать с Enum, они имеют одинаковые базовые значения, которые не вызывают проблем при приведении.

2 голосов
/ 17 февраля 2012

Enum.GetValues(typeof(Enum1)) return {0,1} и foreach будут перечислять в этом диапазоне

1 голос
/ 17 февраля 2012

Полагаю, кто-то вроде Джона Скита может прийти сюда и полностью объяснить, что происходит лучше меня, но этот код:

foreach (Enum2 e in Enum.GetValues(typeof(Enum1)))
{
    Console.WriteLine(e);
}

... видит все ваши Enum1 значениякак Enum2 типов.

Поскольку тип данных enum подобен типу данных int, ваши числовые значения из Enum1 используются для индексации Enum2.

1 голос
/ 17 февраля 2012

Здесь есть неявное приведение из Enum1 -> int и int -> Enum2.

0 голосов
/ 17 февраля 2012

Причина этого заключается в том, что перечисления неявно преобразуются в System.Int (при условии, что они являются целочисленными, то есть по умолчанию).

Затем ваш второй foreach явно приводит результаты Enum.GetValues(typeof(Enum1)) к Enum2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...