2009-11-11 51 views
1

當我們宣佈(例如)List<T>我能理解的聲明,但假設我宣佈泛型 - 澄清所需

IEnumerable<T<T1, T2>> 

什麼其實我表白?

  1. 是不是說,IEnumerable<T>包含兩個泛型? (使用它的方法是什麼?)

  2. 我可以擁有像Person<T<T2<T3<P1,P2>>>>這樣的深層嵌套嗎?

簡單的例子會非常有幫助。

回答

4

如果有一個類

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

然後可以聲明的方法

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

即返回雙可枚舉其中每對包含一個int和一個字符串的方法。

用法:

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

您還可以深深嵌套這些:

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

即返回雙可枚舉其中每對包含一個int和一對兩個字符串的方法。

這適用於仿製藥,以及:

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

即返回雙可枚舉其中每對包含一個T1和T2的方法。

但你不能做到這一點:

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

非常好的朋友,真的幫了我很多。 :) 千恩萬謝。 – user160677 2009-11-11 16:58:59

4

除非你真的得到了一個通用類型,稱爲T,這將無法正常工作。你需要一個真實的類型,例如

IEnumerable<Dictionary<string, int>> 

這是一個Dictionary<string, int>參考序列。

但是,是的,你可以嵌套泛型很多 - 它變得相當不可讀:

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

是U喬恩斯基特?爲什麼你把標題改爲託尼小馬? – user160677 2009-11-11 16:06:43

+0

@csharpbaby:是的,我是Jon Skeet。請參閱http://www.vimeo.com/7516539 – 2009-11-11 16:07:57

+0

其實我正在深入閱讀C#,因爲您提到了IEnumerable >,通過閱讀,我提出了這個問題。謝謝澄清。 – user160677 2009-11-11 16:10:58

1

上面的例子不會編譯。但是你可以彼此中嵌入泛型類型的東西是這樣的:

IEnumerable<IEnumerable<int>> 

這將是一個枚舉整數的枚舉(這將作爲一個鋸齒形二維數組)的。

1

(1)您聲明瞭IEnumerable枚舉類型爲T<T1, T2>的對象。例如,Hashtable<Int, String>

(2)當然可以!