2010-03-25 4 views
11

У меня есть одно сомнение относительно перегрузки и разрешения вызова 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) он вызывает другого. Это звучит неловко, поскольку оба значения имеют один и тот же тип (int), но они «связаны» для разных методов.

+2

Отличный первый вопрос! –

+0

Он также относится к этому утверждению MyEnum e = 0; Но вы получите ошибку компилятора (требуется явное преобразование), если записать это MyEnum e = 1; – RockWorld

+0

Дубликат http://stackoverflow.com/questions/1633168/why-does-c-3-allow-the-implicit-conversion-of-literal-zero-0-to-any-enum –

ответ

7

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

См., Например, эти blogposts.

+1

0 неявно конвертируется в любой тип перечисления в то время как 1 нет !? – Galilyou

+0

@Galilyou: Правильно. – SLaks

+4

@Galilyou: цитата из спецификации языка C# (раздел 1.10): * «Для того, чтобы значение типа по умолчанию было легко доступно, литерал 0 неявно преобразуется в любой тип перечисления». * –

1

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

public void method(MyEnum e) { 
} 

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

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

+2

Пока ваш ответ (в основном), это не то, о чем спрашивал ОП. –

+1

Прочтите вопрос. – SLaks

+0

Я все еще думаю, что это стоит упомянуть, потому что лучше читать код MyEnum.Value1, чем предположить, что 0 будет неявным образом передать его перечислению. Тогда вам не придется беспокоиться о том, чтобы попасть в неправильный перегруженный метод. –

Смежные вопросы