这个问题在这里已有答案:
我有这个代码:
void Foo<T>(T x) {} where T:class
interface IBar {}
IBar GetBar() {...}
尽管将隐式类型约束设置为class,但我仍然可以抽象调用并传递接口:
Foo<IBar>(GetBar());
为什么在这种情况下不强制执行类型约束?
但是,如果我使用这种结构:
void Doo<T>(T x) {
Foo<T>(x);
}
然后编译器将抛出一个错误并抱怨类型'T'必须是一个引用类型,这是预期的。
接口是引用类型。 where : class
约束并不意味着T
必须是一个类,它说T
必须是一个refence类型。
实际上,强制执行类型约束。您似乎认为接口不是类。但是接口只是一种类:从技术上讲,它是一个抽象类,具有进一步约束,可能没有具体成员。
The doc为where T : class
说明了这一点:
type参数必须是引用类型。此约束也适用于任何类,接口,委托或数组类型。