Типы перечислений различны, но вас смущает неявное приведение, которое находится в 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
есть неявное приведение (даже если это, как правило, не работает), по-моему, большинство разработчиков смущает.
Из раздела 8.8.4 спецификации C # 3.0:
Вышеуказанные шаги, в случае успеха,
однозначно изготовить коллекцию
тип C, тип E перечислителя и элемент
тип T. оператор foreach из
форма
foreach (V v in x) embedded-statement
затем расширяется до:
{
E e = ((C)(x)).GetEnumerator();
try {
V v;
while (e.MoveNext()) {
v = (V)(T)e.Current;
embedded-statement
}
}
finally {
... // Dispose e
}
}
Само преобразование перечисления описано в разделе 6.2.2:
Явные преобразования перечисления
являются:
- От sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double или decimal до любого типа enum.
- От любого типа enum до sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double или decimal.
- От любого типа перечисления до любого другого типа перечисления.
явное преобразование перечисления
между двумя типами обрабатывается
лечение любого участвующего типа enum
как основной тип этого
enum-type, а затем выполняя
неявный или явный числовой
преобразование между полученным
типы. Например, учитывая тип enum
E с и базовый тип int, а
выполняется преобразование из E в байт
как явное числовое преобразование
(§6.2.1) от int к байту и
преобразование из байта в E обрабатывается
как неявное преобразование чисел
(§6.1.2) из байта в int.