2010-03-25 21 views
11

Tengo una duda sobre la sobrecarga del método C# y la resolución de llamadas.¿Por qué las llamadas C# son diferentes para métodos sobrecargados para diferentes valores del mismo tipo?

Supongamos que tengo el siguiente código 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) { 
} 

Nota que sé cómo hacer que funcione, pero me gustaría saber por qué para un valor de int (0) se llama a un método y para otro (1) llama a otro. Suena incómodo ya que ambos valores tienen el mismo tipo (int) pero están "vinculados" para diferentes métodos.

+2

¡Excelente primera pregunta! –

+0

Se aplica a esta declaración también MyEnum e = 0; Pero obtendrá un error del compilador (se requiere una conversión explícita) si escribe esto MyEnum e = 1; – RockWorld

+0

Duplicado de http://stackoverflow.com/questions/1633168/why-does-c-3-allow-the-implicit-conversion-of-literal-zero-0-to-any-enum –

Respuesta

7

Literal 0 es implícitamente convertible a cualquier tipo enum, que es una coincidencia más cercana que object. Spec.

Vea, por ejemplo, estos blogposts.

+1

0 es implícitamente convertible a cualquier tipo de enumeración mientras que 1 no es? – Galilyou

+0

@Galilyou: Correcto. – SLaks

+4

@Galilyou: cita de la Especificación del lenguaje C# (sección 1.10): * "Para que el valor predeterminado de un tipo de enumeración sea fácilmente disponible, el literal 0 se convierte implícitamente en cualquier tipo de enumeración." * –

1

Estoy bastante seguro de que llamar

public void method(MyEnum e) { 
} 

correctamente es necesario pasar en MyEnum.Value1 o MyEnum.Value2. Enum! = Int type, de ahí por qué tiene que convertir int en su tipo de enumeración. De modo que (MyEnum)1 o (MyEnum)0 funcionarían correctamente.

En su caso, 0 fue lanzado implícitamente a su tipo de enumeración.

+2

Mientras tu respuesta es (mayormente) correcto, eso no fue lo que el OP preguntó. –

+1

Lea la pregunta. – SLaks

+0

Todavía creo que vale la pena mencionarlo porque es mejor para la legibilidad codificar MyEnum.Value1 que suponer que 0 lo lanzará implícitamente a la enumeración. Entonces no tendría que preocuparse por caer en el método sobrecargado incorrecto –

Cuestiones relacionadas