2009-11-11 4 views
1

Lorsque nous déclarons (par exemple) List<T> Je peux comprendre la déclaration, mais suppose que je déclareGénériques - Précisions requises

IEnumerable<T<T1, T2>> 

Qu'est-ce que je déclare en fait?

  1. Est-ce que cela signifie, IEnumerable<T> contient deux types génériques? (Quelle est la façon de l'utiliser?)

  2. Puis-je avoir un niveau imbriqué profond comme Person<T<T2<T3<P1,P2>>>>?

Un exemple simple sera vraiment utile.

Répondre

4

Si vous avez une classe

public class Pair<T1, T2> { ... } 

vous pouvez déclarer une méthode

IEnumerable<Pair<int, string>> GetPairs(); 

dire une méthode qui renvoie une dénombrable de paires où chaque paire se compose d'un int et une chaîne.

Utilisation:

foreach (Pair<int, string> pair in GetPairs()) { ... } 

Vous pouvez également profondément nid ceux-ci:

IEnumerable<Pair<int, Pair<string, string>>> GetPairs(); 

-à-dire un procédé qui renvoie un dénombrable de paires où chaque paire est constituée d'un int et une paire de deux chaînes.

Cela fonctionne avec les génériques ainsi:

IEnumerable<Pair<T1, T2>> GetPairs<T1, T2>(); 

-à-dire un procédé qui renvoie un dénombrable de paires où chaque paire est constituée d'un T1 et T2.

Mais vous ne pouvez pas le faire:

IEnumerable<T<T1, T2>> GetGenericPairs<T, T1, T2>(); 
+0

Excellent pote, m'a vraiment beaucoup aidé. :) Mille mercis. – user160677

4

Sauf si vous avez réellement obtenu un type générique appelé T, cela ne fonctionnera pas. Vous avez besoin d'un type réel, par exemple.

IEnumerable<Dictionary<string, int>> 

qui est une séquence de références Dictionary<string, int>.

Mais oui, vous pouvez génériques imbriquer beaucoup - et il devient assez illisible:

List<Dictionary<List<IEnumerable<string>>, Dictionary<int, int>>> aargh = null; 
+0

sont u jon au pigeon d'argile? pourquoi avez-vous changé le titre à Tony le poney? – user160677

+0

@csharpbaby: Oui, je suis Jon Skeet. Voir http://www.vimeo.com/7516539 –

+0

En fait, je suis en train de lire C# en profondeur en ce que vous avez mentionné IEnumerable >, en lisant cela, j'ai soulevé cette question.Merci de clarifier. – user160677

1

L'exemple ci-dessus ne compilera pas. Mais vous pouvez intégrer les types génériques dans l'autre avec quelque chose comme ceci:

IEnumerable<IEnumerable<int>> 

Ce qui serait un dénombrable d'un dénombrable de ints (qui agirait comme un tableau à 2 dimensions en dents de scie).

1

(1) Vous avez déclaré un IEnumerable qui énumère les objets de type T<T1, T2>. Par exemple, Hashtable<Int, String>.

(2) Bien sûr, vous pouvez!

Questions connexes