为何类型约束在设置为class时并不总是强制执行? [重复]

问题描述 投票:0回答:2

我有这个代码:

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

c# generics type-constraints
2个回答
1
投票

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


-2
投票

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

The docwhere T : class说明了这一点:

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

© www.soinside.com 2019 - 2024. All rights reserved.