我有此代码:
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'必须是预期的引用类型。
答案 0 :(得分:1)
接口是参考类型。 where : class
约束并不意味着T
必须是一个类,而是说T
必须是引用类型。
答案 1 :(得分:-2)
实际上,类型约束是强制执行的。您似乎在想接口不是类。但是接口只是类的一种:从技术上讲,它是一个抽象类,进一步限制了没有具体的成员。
The doc指出where T : class
的情况:
type参数必须是引用类型。此约束也适用于任何类,接口,委托或数组类型。