例如,函数原型是:
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>;
(我将在我的答案前面提醒参数和参数之间的区别:参数是某些东西的“占位符”,而参数是填充参数的值。(因此术语“参数参数”) . 例如,类List<TFoo>
有一个名为 的参数TFoo
,但实例List<String>
有一个参数String
的参数TFoo
。)。
类型是“通用”或“具体”(即非通用)。
泛型类型参数参数可以是任何类型,具体的或泛型的。一个泛型类型的所有参数都填充了具体的类型参数,它本身就变成了具体的;所以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 Type
,那么对于List<int>
被允许作为类型参数的问题是肯定的。但是,您的示例无法编译,因为a
isint
和 not Type
。