2011-07-22 24 views
10

considerar el Códigoresolución de sobrecarga de métodos virtuales

public class Base 
{ 
    public virtual int Add(int a,int b) 
    { 
     return a+b; 
    } 
} 

public class Derived:Base 
{ 
    public override int Add(int a,int b) 
    { 
     return a+b; 
    } 

    public int Add(float a,float b) 
    { 
     return (Int32)(a + b); 
    } 
} 

Si creo una instancia de la clase derivada y llamar Añadir a los parámetros de tipo int razón por la que está llamando el método Add con los parámetros de flotación

Derived obj =new Derived() 
obj.Add(3,5) 

// why this is calling 
Add(float a,float b) 

¿Por qué no está llamando al método más específico?

+1

¿Cómo sabes que 3 y 5 son int? Intente especificar sus tipos y vea qué sucede. –

+0

¿Cómo lo sabes? –

+0

¿Puedes compilar esto? Puede obtener algunos errores de conversión como float to int? – Anuraj

Respuesta

15

Esto es por diseño. Sección 7.5.3 de los estados de la especificación del lenguaje C#:

Por ejemplo, el conjunto de candidatos para una invocación de método no incluye métodos de anulación marcado (§ 7.4), y métodos en una clase base no son candidatos si cualquier método en una clase derivada es aplicable (§7.6.5.1).

En otras palabras, debido a que su clase Derived tiene un método no reemplaza Add, el método en la clase AddBase (y su versión reemplaza en Derived) ya no son candidatos para la resolución de sobrecarga.

Aunque Base.Add(int,int) sería una mejor coincidencia, la existencia de Derived.Add(float,float) significa que el método de clase base nunca es considerado por el compilador.

Eric Lippert explica algunas de las razones de este diseño en this blog post.

+0

+1 buena respuesta. Prueba, explicación y enlaces para leer más. – Matt

+0

¿Hay alguna manera de agregar una sobrecarga para un método virtual mientras se mantiene el método original visible también? – supercat

Cuestiones relacionadas