2010-11-11 17 views
5
class Base 
{} 

class Sub : Base 
{} 


void AddNewBase(Base t, LinkedList<Base> list){ ... } 
... 
{ 

    Sub asub = new Sub(); 

    LinkedList<Sub> asubList = new LinkedList<Sub>(); 
    AddNewBase(asub,asubList) // doesn't work 
} 

essentiellement, j'ai une fonction d'insertion personnalisé qui prend un nouvel élément et une liste pour le mettre dans, et il fait un peu de choses « tri » pour trouver un bon endroit pour le mettre dans le liste.C# dans les types génériques

problème est, je veux faire cela en fonction des propriétés dans 'Base' donc il serait bon d'avoir une seule fonction qui pourrait le faire pour toutes les listes de sous-types.

Je pense que ce que je genre de veux est:

static void AddNewBase<T>(T t, LinkedList<T> list){ ... } 

mais avec une certaine façon de clarifier T comme: « où T est une sous-classe de base »

+1

Il n'y a pas de modèles en C#. – dtb

+0

quelle version? C# 4 et .NET 4 ont des façons de le faire. Les versions précédentes ne l'ont pas. –

+2

Dans ce cas, .NET 4.0 n'aide pas beaucoup, car 'LinkedList ' n'est ni covariant ni contravariant. Généralement, le type générique doit être soit "en lecture seule" (par exemple "IEnumerable "), soit "en écriture seule" (par exemple "Action ") pour permettre la covariance ou la contravariance. – stevemegson

Répondre

0

Vous pouvez utiliser mot-clé de la même manière et vous n'avez pas besoin d'un type générique.

Voici ce qui est probablement la mise en œuvre IComparable ce que vous pourriez rechercher dans un problème de tri classique:

static void AddNewBase<T>(T t, LinkedList<T> list) where T : IComparable 
    { 
     // 
    } 
0

En C# 4, vous pouvez utiliser covariance pour faire ce travail. Vous devez sélectionner l'une des interfaces de collecte génériques covariantes. Par exemple, redéclarant votre méthode comme:

static void AddNewBase(Base t, IEnumerable<Base> list) { //... } 

Est-ce que vous permettra d'appeler AddNewBase avec un LinkedList<Sub>.