2009-08-23 6 views

risposta

27

Questa funzione è denominata "covarianza del tipo di ritorno". C# non lo supporta per i seguenti motivi:

1) Il CLR non lo supporta. Per farlo funzionare in C#, dovremmo solo sputare un sacco di piccoli metodi di supporto che convertono il tipo restituito alla cosa giusta. Non c'è nulla che ti impedisca di farlo tu stesso.

2) Anders ritiene che la covarianza del tipo di ritorno non sia una buona caratteristica del linguaggio.

3) \ Abbiamo molte priorità più alte per la lingua. Abbiamo solo budget limitati e quindi cerchiamo di fare solo le migliori funzionalità che possiamo in ogni data release. Certo, sarebbe bello, ma è abbastanza facile da fare da solo se lo si desidera. È meglio passare il tempo aggiungendo funzionalità che migliorano l'esperienza degli sviluppatori o aggiungono maggiore potenza di rappresentazione alla lingua.

+0

abbastanza giusto :), grazie per la risposta. –

+7

Sai se sono disponibili ulteriori informazioni su # 2? Mi piace leggere su problemi linguistici come quello. :) –

+0

La risposta di Brian Gideon a questa domanda fornisce un esempio di come fare # 1. –

5

Le firme devono corrispondere esattamente a ciò che l'interfaccia specifica. Non c'è motivo per cui non è possibile restituire un'istanza di X dal metodo, ma la firma del metodo dovrà utilizzare IB.

Per quanto riguarda un motivo razionale .. è probabilmente preferibile dal punto di vista della leggibilità del codice.

È possibile implementare l'interfaccia in modo esplicito e fornire una firma alternativa che restituisca X non definita dall'interfaccia. Se sai che il tuo IA è in realtà un X, puoi invece usarlo.

3

Perché C# non supporta la co e la contravvenzione per le interfacce in fase di compilazione. In questo modo un'implementazione del metodo IA.Test() deve corrispondere esattamente alla sua dichiarazione. È possibile, tuttavia, tornare istanza di X in runtime

1
public X test(); 

Devi dichiarare un corpo per tutti i metodi in ogni classe che non è astratta.

Prova questo:

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

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

Si potrebbe utilizzare implementazione dell'interfaccia esplicita per evitare il problema.

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

    IB IA.test() 
    { 
    return this; 
    } 
} 

interface IA 
{ 
    IB test(); 
} 

interface IB 
{ 
} 
+0

+1 per fornire il lavoro intorno. Grazie! –

Problemi correlati