sobrecargados - redefine operator c#
El método sobrecarga la resolución y los enigmas de Jon Skeet (5)
Aquí hay una posible explicación:
Cuando el compilador vincula las llamadas al método, busca el primer lugar en la clase más baja de la cadena de herencia (en este caso, la clase Derived
). Sus métodos de instancia son verificados y emparejados. El método anulado Foo no es un método de instancia Derived
, es un método de instancia de la clase Base
.
La razón por la cual podría ser el rendimiento, como propuso Jack30lena, pero también podría ser la forma en que el compilador interpreta la intención del codificador. Es una suposición segura de que el comportamiento del código previsto por el desarrollador se encuentra en el código al final de la cadena de herencia.
Aquí estén los spoilers ...
Estoy mirando la answer al # 1, y debo admitir que nunca supe que este era el caso en la resolución de sobrecarga. Pero ¿por qué es este el caso. En mi pequeña mente Derived.Foo(int)
parece ser la ruta lógica para bajar.
¿Cuál es la lógica detrás de esta decisión de diseño?
¡TIEMPO EXTRA!
¿Es este comportamiento un resultado de la especificación de C #, la implementación de CLR o el compilador?
Es un resultado del compilador, examinamos el código IL.
Este comportamiento es deliberado y cuidadosamente diseñado. La razón es porque esta opción mitiga el impacto de una forma del fallo de clase base frágil.
Lea mi artículo sobre el tema para más detalles.
http://blogs.msdn.com/ericlippert/archive/2007/09/04/future-breaking-changes-part-three.aspx
La razón es porque es ambigua. El compilador solo tiene que decidir por uno. Y alguien pensó que lo menos indirecto sería mejor (el rendimiento podría ser una razón). Si el desarrollador acaba de escribir:
((Base)d).Foo (i);
Es claro y te da el resultado esperado.
La razón es: el rendimiento. Llamar a un método virtual lleva un poco más de tiempo. llamar a un delegado en un método virtual lleva mucho más tiempo y así sucesivamente ...