2009-08-23 8 views

Respuesta

27

Esta función se denomina "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 de tipo de retorno no es una buena característica de idioma.

3) \ Tenemos muchas más prioridades para el idioma. 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.

+0

justo lo suficiente :), gracias por la respuesta. –

+7

¿Sabe si hay alguna información adicional sobre el n. ° 2 disponible? Me gusta leer sobre problemas de lenguaje como ese. :) –

+0

La respuesta de Brian Gideon a esta pregunta proporciona un ejemplo de cómo hacer # 1. –

5

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 ... es probablemente preferible desde el punto de vista de 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 sabes que tu IA es en realidad un X, podrías usarlo en su lugar.

3

Porque C# no admite co y contrariedad para interfaces en tiempo de compilación. De esta forma, una implementación del método IA.Test() debe coincidir exactamente con su declaración. Puede, sin embargo, volver instancia de X en tiempo de ejecución

1
public X test(); 

Debe declarar un cuerpo para todos los métodos de cualquier clase que no es abstracto.

Prueba esto:

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

interface IA 
{ 
    IB test(); 
} 
interface IB { }; 
15

Usted podría utilizar 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 
{ 
} 
+0

1 para proporcionar el trabajo alrededor. ¡Gracias! –

Cuestiones relacionadas