Почему вызовы C # различны для перегруженных методов для разных значений одного типа? - PullRequest
12 голосов
/ 25 марта 2010

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

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

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), но они «связаны» для разных методов.

Ответы [ 4 ]

8 голосов
/ 25 марта 2010

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

См., Например, эти блог сообщений .

1 голос
/ 25 марта 2010
1 голос
/ 25 марта 2010

На это уже ответили здесь

1 голос
/ 25 марта 2010

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

public void method(MyEnum e) {
}

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

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

...