2010-07-05 4 views
2

Désolé de poser cette question qui semble évidente.Classe générique avec méthode prenant une classe générique différente

J'ai une classe générique "adaptateur" de type T où T est une interface définie. Je veux créer une méthode dans cette classe qui prend un type différent d'adaptateur générique. Cela me donne une erreur de compilation Cannot resolve symbol 'S'.

Je voudrais être capable de faire;

MyOne one = new Adapter<TypeOne>(); 
    MyTwo two = new Adapter<TypeTwo>(); 
    one.TakeAnotherType(two); 

Si je change la méthode de prendre Adapter<T> alors il se plaint que "deux" est pas de type Adapter<TypeOne>

Répondre

8
void TakeAnotherType<S>(Adapter<S> other) where S:ICommon 
{ } 

Parce que le type générique T de Adapter est contraint à ICommon, il est important pour contraindre également S de la même manière, car il est utilisé comme type générique pour Adapter<T>, il doit donc également satisfaire à la contrainte ICommon.

+0

+1 - merci, c'est fait l'affaire. –

2

il suffit de changer

void TakeAnotherType(Adapter<S> other) 

dans

void TakeAnotherType<S>(Adapter<S> other) where S : ICommon 

et cela devrait fonctionner.

+0

+ 1 merci, aurait lutté avec ça pendant un moment –

1

Une fois que vous avez spécifié qu'une classe est générique (en l'appelant Something<T>), chaque méthode qu'elle contient est implicitement générique sur ce type T. Pour dire qu'une méthode est générique sur un type différent, vous devez spécifier ce fait dans le nom de la méthode, en l'appelant SomeMethod<U>. Le corps de cette méthode aura alors accès aux deux types, T (le type que la classe est générique) et U (la classe que la méthode est générique). Notez également que les deux conventions habituelles pour les paramètres de type sont T, U, V etc; ou TSomething, TSomethingElse, TEvenMore. Je ne pense pas avoir jamais vu S utilisé ...

Questions connexes