¿Por qué se ignoran las firmas declaradas en la clase base?

class Base { public virtual void MethodA(int x) { Console.WriteLine ("In Base Class"); } } class Derived : Base { public override void MethodA(int x) { Console.WriteLine ("In derived INT)"); } public void MethodA(object o) { Console.WriteLine ("In derived OBJECT"); } } class Test { static void Main() { Derived d = new Derived(); int k = 20; d.MethodA(k); } } 

La salida que obtuve para esto es ” En OBJETO derivado “. ¿Cuál es la razón de este extraño comportamiento? Después de algunas investigaciones, descubrí que la razón es que las firmas declaradas en la clase base se ignoran . ¿Por qué son ignorados?

Esto es por diseño y por una buena razón. Este diseño ayuda a prevenir el problema de la clase base frágil. C # fue diseñado para hacer más fácil y seguro escribir componentes “versionados”, y esta regla es una gran parte de eso.

Esta es una pregunta muy frecuente. Este es uno de los “informes de errores falsos” más comunes que recibimos; es decir, alguien cree que ha encontrado un error en el comstackdor cuando, de hecho, ha encontrado una característica.

Para obtener una descripción de la función y por qué está diseñada de la forma en que está, consulte mi artículo sobre el tema:

http://blogs.msdn.com/b/ericlippert/archive/2007/09/04/future-breaking-changes-part-three.aspx

Para obtener más artículos sobre el tema de cómo los distintos idiomas se ocupan del problema de la clase base frágil, vea mi archivo de artículos sobre el tema:

http://blogs.msdn.com/b/ericlippert/archive/tags/brittle+base+classes/

El comstackdor en VC # 2008 verifica las funciones no virtuales disponibles antes que las virtuales, al decidir qué llamar. Dado que su clase Derivada tiene un MethodA (objeto) no virtual al que se puede llamar, el comstackdor lo llama.

Si agrega un Método A virtual (objeto) a la Base, entonces se llamará a Derived.MethodA (int), porque entonces tanto el MétodoA (objeto) como el MétodoA (int) son virtuales.

No estoy lo suficientemente familiarizado con la especificación del lenguaje C # para saber si se trata de un comportamiento específico o un error en el comstackdor.