Возможно, вы не знаете, что существует неявное преобразование из константы 1 из 0 в любое перечисление:
Bar x = 0; // Implicit conversion
Теперь преобразование из 0 в Bar
более конкретно, чем преобразование из 0 в object
, поэтому используется перегрузка Foo(Bar)
.
Это все проясняет?
1 На самом деле есть ошибка в компиляторе Microsoft C #, которая позволяет ей быть любая нулевая константа, а не просто целое число:
const decimal DecimalZero = 0.0m;
...
Bar x = DecimalZero;
Маловероятно, что это когда-либо будет исправлено,как это может сломать существующий рабочий код.Я полагаю, что у Эрика Липперта есть два блога постов , которые углубляются в детали.
Раздел 6.1.3 спецификации C # (спецификация C # 4) имеет это, чтобы сказатьоб этом:
Неявное преобразование перечисления позволяет преобразовать десятичный-целочисленный-литерал 0 в любой тип перечисления и в любой тип nullable-типа базовый тип которого перечислимый тип .В последнем случае преобразование оценивается путем преобразования в базовый enum-type и переноса результата (§4.1.10).
Это фактически говорит о том, что ошибка не 'Это просто для разрешения неправильного типа, но для преобразования любого значения константы 0, а не только литерального значения 0.
РЕДАКТИРОВАТЬ: похоже, что "константа" была частично введена в C #3 компилятор .Раньше это были некоторые константные значения, теперь похоже, что все они.