У меня есть одно сомнение относительно 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) это называет другого. Это звучит неловким, так как оба значения имеют тот же тип (интервал), но они "связаны" для различных методов.
Литерал 0
неявно конвертируется в любой тип перечисления
, что является более близким соответствием, чем объект
. Спецификация .
Почему C # допускает неявное преобразование буквального нуля в любое перечисление? - хорошая ссылка, в которой есть отличный ответ от JaredPar.
Я уверен, что вызову
public void method(MyEnum e) {
}
правильно, вам нужно передать MyEnum.Value1
или MyEnum.Value2
. Enum ! = тип int, поэтому вам нужно привести int к типу перечисления. Итак, (MyEnum) 1
или (MyEnum) 0
будут работать правильно.
У вас r, 0 был неявно приведен к вашему типу перечисления.