Почему вызовы С# разные для перегруженных методов для разных значений одного и того же типа?

У меня есть одно сомнение в отношении перегрузки и разрешения вызовов С#.

Предположим, что у меня есть следующий код С#:

enum MyEnum { Value1, Value2 }

public void test() {
    method(0); // this calls method(MyEnum)
    method(1); // this calls method(object)
}

public void method(object o) {
}

public void method(MyEnum e) {
}

Обратите внимание, что я знаю, как заставить его работать, но я хотел бы знать, почему для одного значения int (0) он вызывает один метод, а для другого (1) он вызывает другого. Это звучит неловко, поскольку оба значения имеют один и тот же тип (int), но они "связаны" для разных методов.

Ответ 1

Литерал 0 неявно конвертируется в любой тип enum, который является более близким, чем object. Spec.

Смотрите, например, эти blog posts.

Ответ 2

Я уверен, что позвоню

public void method(MyEnum e) {
}

правильно вам нужно пройти в MyEnum.Value1 или MyEnum.Value2. Enum!= Int type, поэтому вы должны использовать int для вашего типа перечисления. Таким образом, (MyEnum)1 или (MyEnum)0 будут работать правильно.

В вашем случае 0 был неявно включен в ваш тип перечисления.

Ответ 3

Этот ответ уже ответил здесь