c# – 为什么将泛型参数指定为接口不是带有类约束的错误?

如果我有这样的通用方法:

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);

如您所见,它完全忽略了通用约束.所以我的问题是为什么在我们有类约束时允许将接口指定为类型参数?

最佳答案
“类”约束实际上是一个“引用类型”约束 – 它并不特别指代类. (它也适用于委托类型.)从the MSDN page on generic type constraints

The type argument must be a reference type; this applies also to any class, interface, delegate, or array type.

现在举个例子:

As you can see it completely avoids the generic constraint.

不,不.它使用ICollection< int>作为类型参数,这是一个引用类型.请注意,由于装箱,您传入方法的值是参考.

转载注明原文:c# – 为什么将泛型参数指定为接口不是带有类约束的错误? - 代码日志