Por qué C # no permite la herencia del tipo de devolución al implementar una interfaz

¿Hay alguna razón racional por la cual el siguiente código no es legal en C #?

class X: IA, IB { public X test() // Compliation Error, saying that X is not IB { return this; } } interface IA { IB test(); } interface IB { }; 

Esta característica se llama “covarianza de tipo de retorno”. C # no lo admite por las siguientes razones:

1) El CLR no lo admite. Para que funcione en C #, tendríamos que escupir un montón de pequeños métodos de ayuda que hacen moldes en el tipo de devolución a la derecha. No hay nada que te impida hacer eso tú mismo.

2) Anders cree que la covarianza del tipo de retorno no es una buena característica del lenguaje.

3) \ Tenemos muchas prioridades más altas para el lenguaje. Solo tenemos presupuestos limitados, por lo que tratamos de hacer las mejores funciones posibles en cualquier versión. Claro, esto sería bueno, pero es bastante fácil de hacer por su cuenta si así lo desea. Mejor que pasemos el tiempo agregando funciones que mejoren la experiencia del desarrollador o agreguen más poder de representación al lenguaje.

Puede usar la implementación de interfaz explícita para evitar el problema.

 class X : IA, IB { public X test() { return this; } IB IA.test() { return this; } } interface IA { IB test(); } interface IB { } 

Las firmas deben coincidir exactamente con lo que especifica la interfaz. No hay ninguna razón por la que no pueda devolver una instancia de X del método, pero la firma del método deberá usar IB .

En cuanto a una razón racional … probablemente sea preferible desde el punto de vista de la legibilidad del código.

Puede implementar la interfaz explícitamente y proporcionar una firma alternativa que devuelva X que no está definida por la interfaz. Si sabe que su IA es en realidad una X , podría usarla en su lugar.

Porque C # no admite co y contrariedad para las interfaces en tiempo de comstackción. De esta forma, una implementación del método IA.Test () debe coincidir exactamente con su statement. Sin embargo, puede devolver una instancia de X en tiempo de ejecución

 public X test(); 

Debe declarar un cuerpo para todos los métodos en cualquier clase que no sea abstracta.

Prueba esto:

 class X : IA, IB { public IB test() { return new X(); } } interface IA { IB test(); } interface IB { };