[英]Why specifying a generic argument as interface is not an error with a class constraint?
如果我有这样的通用方法:
static void Foo<T>() where T : class
{
}
我可以通过指定接口类型来调用它,例如ICollection<int>
Foo<ICollection<int>>();
现在假设我有一个实现ICollection<int>
:
struct Bar : ICollection<int>
我不能将它明确指定为类型参数,但如果我有一个ICollection<int>
类型的变量具有底层类型Bar
,并且我的泛型方法更改为采用类型为T
的参数,我可以这样做:
static void Foo<T>(T arg) where T : class
{
}
ICollection<int> bar = new Bar();
Foo <ICollection<int>>(bar);
如您所见,它完全忽略了通用约束。 所以我的问题是为什么在我们有class
约束时允许将接口指定为类型参数?
“类”约束实际上是一个“引用类型”约束 - 它并不特别指代类。 (它也适用于委托类型。)从泛型类型约束的MSDN页面 :
type参数必须是引用类型; 这也适用于任何类,接口,委托或数组类型。
现在举个例子:
如您所见,它完全避免了通用约束。
不,不。 它使用ICollection<int>
作为类型参数,这是一个引用类型。 请注意,由于装箱,您传入方法的值是参考。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.