例如,函數原型爲:我們可以在C#中的泛型中寫List作爲類型參數嗎?
void set<V>(Type a, V b);
,我們稱其爲:
int a;
list<int> b;
set<List<int>>(a,b);
例如,函數原型爲:我們可以在C#中的泛型中寫List作爲類型參數嗎?
void set<V>(Type a, V b);
,我們稱其爲:
int a;
list<int> b;
set<List<int>>(a,b);
您可以使用通用約束像這樣:
void set<TList, TElement>(TElement value, TList list)
where TList: IList<TElement>;
(我會在我的答案前加一個參數和參數區別的提示:參數是某物的「佔位符」,參數是填充參數的值(因此t erm「參數參數」)。例如,類List<TFoo>
具有名爲TFoo
的參數,但實例List<String>
對於參數TFoo
具有參數String
。)。
類型是「通用」或「具體」(即非通用)。
通用類型參數參數可以是任何類型,具體的或通用的。一個泛型類型,其所有參數都被具體類型參數填充,成爲具體的本身;所以List<String>
是具體的,因爲String
是具體的,但List<TFoo>
不具體,因爲TFoo
是一個類型參數。
因此,很容易發現泛型類可以以通用形式或以具體形式遞歸嵌套。當然,你可以只使用通用形式的泛型類或方法範圍內,例如以下是完全合法的:
private static IEnumerable<List<Dictionary<String,Int32>>> foo = new Collection<List<Dictionary<String,Int32>>>(); // this is completely concrete
static void DoSomething<TBaz>(IEnumerable<List<Dictionary<TBaz,Int32>>> baz) { // this is generic because TBaz is not specified
List<TBaz> someList = new List<TBaz>(); // you can use the undefined TBaz because it's listed in the generic method's type arguments.
}
static void Main() {
DoSomething(foo); // the compiler will infer TBaz from the String argument used in the foo field
}
我想你想詢問是否可以做出具體Type a
到V
.. 。
,如果這是你的問題,那麼,你必須定義方法如下所示:
void set<V>(V a, List<V> b)
如果你意味着a
是Type
型的,然後是到0123的問題被允許作爲類型參數。你的例子不會編譯,但是,因爲a
是int
而不是Type
。
在這個例子中使用「Type」這個詞是個壞主意,因爲'Type'是一個.NET框架類,並且存在.no從'int'到'Type'的轉換。至少,它把我扔了一秒鐘。 –