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

Sel*_*enç 6 c# generics

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

static void Foo<T>() where T : class
{

}
Run Code Online (Sandbox Code Playgroud)

例如,我可以通过指定接口类型来调用它 ICollection<int>

Foo<ICollection<int>>();
Run Code Online (Sandbox Code Playgroud)

现在假设我有一个实现的结构ICollection<int>:

struct Bar : ICollection<int>
Run Code Online (Sandbox Code Playgroud)

我不能明确地将它指定为类型参数,但如果我有一个ICollection<int>具有基础类型的类型的变量Bar,并且更改我的泛型方法以获取类型的参数T,我可以这样做:

static void Foo<T>(T arg) where T : class
{

}

ICollection<int> bar = new Bar();
Foo <ICollection<int>>(bar);
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 7

"类"约束实际上是一个"引用类型"约束 - 它并不特别指代类.(它也适用于委托类型.)从泛型类型约束的MSDN页面:

type参数必须是引用类型; 这也适用于任何类,接口,委托或数组类型.

现在举个例子:

如您所见,它完全避免了通用约束.

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