2011-05-09 2 views
0

J'ai un problème:Generics Problème - C# 3.0

class Base 
{ 
} 

class DerivedClass : Base 
{ 
} 

class Test<T> where T : Base 
{ 
} 

et quelque chose comme ceci:

Test<Base> a = new Test<DerivedClass>();

Je pense qu'il ya un moyen de contourner en C# 4.0, mais est-il un moyen faire quelque chose comme ça en C# 3?

Répondre

3

Réponse courte: Non, il n'y a aucun moyen. Réponse longue: Non, il n'y a aucun moyen ni dans C# 3.0 ni C# 4.0, parce que la co-et contravariance n'est pas supportée dans C# 3.0 du tout et seulement sur les types de délégués et les interfaces dans C# 4.0.

MISE À JOUR:
Si vous souhaitez enregistrer plusieurs instances de cette classe dans une liste, indépendamment du type concret de T, une solution de contournement pourrait ressembler à ceci:
Créer une interface ITest qui utilise partout Base vous utiliserait T. Rendre Test<T> implémenter cette interface et masquer les méthodes de ITest en utilisant l'implémentation d'interface explicite. Utilisez ITest comme type de paramètre pour votre méthode. Exemple de code:

class Base 
{ 
    public int Info { get; set; } 
} 

class Derived : Base 
{ 
    public int Info2 { get; set; } 
} 

interface ITest 
{ 
    Base Data { get; set; } 
} 

class Test<T> : ITest 
    where T : Base 
{ 
    public T Data { get { return (T) (((ITest) this).Data); } set { ((ITest) this).Data = value; } } 

    Base ITest.Data { get; set; } 
} 

List<ITest> list = new List<ITest>(); 
list.Add(new Test<Base>()); 
list.Add(new Test<Derived>()); 

Si vous voulez juste passer cette classe à une méthode sans nécessiter une T spécifique, vous pouvez rendre votre méthode générique ainsi:

void YourMethod<T>(Test<T> test) where T : Base 
{ 
    Console.WriteLine(test.Data.Info); 
} 

YourMethod(new Test<Base>()); 
YourMethod(new Test<Derived>()); 
+0

Que voulez-vous dire par type de délégué? Pouvez-vous élaborer pour C# 4.0 s'il vous plaît? – Twinhelix

+0

S'il vous plaît lire ici sur ce sujet: http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx –

+0

Aussi cette réponse explique pourquoi les classes ne sont pas co - ou contravariant http://stackoverflow.com/questions/2733346/why-isnt-there-generic-variance-for-classes-in-c-4-0/2734070#2734070 –

0

C'est covariance que vous voulez et il n'est pas un moyen de contourner dans C# 3.0, autre que l'utilisation de casting.

Un Test<DerivedClass> ne hérite d'un Test<Base> même si DerivedClass hérite de Base.

+0

Vous ne pouvez pas lancer 'Test ' sur Test '! –

+0

Désolé, je voulais dire lancer à partir d'un «objet». –

+0

Le code 'Test a = new Test ();' n'est pas possible. Peu importe comment vous lancez ... –