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

У меня есть одно сомнение относительно 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) {
}

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

12
задан ROMANIA_engineer 22 January 2018 в 18:24
поделиться

3 ответа

Литерал 0 неявно конвертируется в любой тип перечисления , что является более близким соответствием, чем объект . Спецификация .

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

8
ответ дан 2 December 2019 в 22:22
поделиться
1
ответ дан 2 December 2019 в 22:22
поделиться

Я уверен, что вызову

public void method(MyEnum e) {
}

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

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

1
ответ дан 2 December 2019 в 22:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: