Domanda

Ho classe A:

public class ClassA<T>

La classe B deriva da A:

public class ClassB : ClassA<ClassB>

La classe C deriva dalla classe B:

public class ClassC : ClassB

Ora ho un metodo generico con vincoli

public static T Method<T>() where T : ClassA<T>

OK, ora voglio chiamare:

ClassC c = Method<ClassC>();

ma ricevo l'errore di compilazione che dice: Type argument 'ClassC' does not inherit from or implement the constraint type 'ClassA<ClassC>.

Tuttavia, il compilatore consentirà:

ClassB b = Method<ClassB>();

La mia comprensione è che ciò fallisce perché ClassC eredita ClassA<ClassB> invece di ClassA<ClassC>

La mia vera domanda è: è possibile creare una classe derivante da ClassB che può essere utilizzata in qualche modo con il metodo generico?

Questo può sembrare che i generici siano abusati e sarei d'accordo. Sto cercando di creare oggetti del livello aziendale derivanti dagli oggetti dati subsonici in un progetto separato.

Nota: ho inserito < T & Gt; con spazi extra altrimenti vengono rimossi dalla domanda.

È stato utile?

Soluzione

Bene, puoi cambiare il metodo in:

public static T Method<T,U>() where T : ClassA<U> where U : T

Questo aiuta a tutti? Non è molto utile se non puoi cambiare il metodo ovviamente ...

Altri suggerimenti

No. Devi modificare o racchiudere questo metodo.

Ecco il motivo.

ClassC eredita da ClassB che eredita da ClassA (ClassB)

ClassC non eredita da ClassA (ClassC)

Nessun figlio di ClassB erediterà da ClassA (classe figlio), poiché invece eredita da ClassB e ClassB non eredita da ClassA (classe figlio).

I tipi generici sono invarianti .

Nella maggior parte dei casi è possibile risolvere questo scenario avendo una classe astratta non generica di base:

public abstract class BasicClassA
{
}

public class ClassA<T> : BasicClassA
{
}

public class ClassB : ClassA<ClassB>
{
}

public class ClassC : ClassB
{
}

public static T Method<T>() where T : BasicClassA
{
    return null;
}

Il tuo chilometraggio può variare, tuttavia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top