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