为什么将类型约束设置为class时不总是强制执行?

时间:2018-09-10 19:07:45

标签: c# generics type-constraints

我有此代码:

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'必须是预期的引用类型。

2 个答案:

答案 0 :(得分:1)

接口是参考类型。 where : class约束并不意味着T必须是一个类,而是说T必须是引用类型。

答案 1 :(得分:-2)

实际上,类型约束是强制执行的。您似乎在想接口不是类。但是接口只是类的一种:从技术上讲,它是一个抽象类,进一步限制了没有具体的成员。

The doc指出where T : class的情况:

  

type参数必须是引用类型。此约束也适用于任何类,接口,委托或数组类型。