C# - 扩展泛型参数的泛型接口

时间:2021-07-26 15:33:19

标签: c#

是否可以定义一个扩展接口的泛型参数的泛型接口?

例如(这不会编译,因为继承 T 是不可能的)

public interface IInsecurableService<T>: T { }

通过这种方式,我想将服务添加到具有某些功能的 DI 容器中,而没有扩展的相同服务仍然存在/仍然可以注册。

1 个答案:

答案 0 :(得分:3)

ECMA-335 定义了 CLR,明确排除了这种情况,并给出了理由(第 §9.1 节,我的粗体):

<块引用>

泛型参数本身不能用于指定基类或任何已实现的接口。因此,例如,.class ... G``1<T> extends !0 是无效的。但是,当嵌套在另一个泛型类型中时,基类或接口使用该泛型参数是有效的。例如,.class ... G``1<T> extends class H``1<!0>.class ... G``1<T> extends class B``2<!0,int32> 是有效的。

[基本原理:这允许检查泛型类型在定义时有效,而不是在实例化时有效。例如,在 .class ... G``1<T> extends !0 中,我们不知道哪些方法会覆盖其他方法,因为没有关于基类的信息;事实上,我们甚至不知道 T 是否是一个类:它可能是一个数组或一个接口。同样,对于 .class ... C``2<(!1)T,U>,我们处于同样的情况,对基类/接口定义一无所知。 结束理由]


ECMA-334 定义了 C# 语言规范,也排除了它(第 18.2.4 节):

<块引用>

显式基接口可以是构造接口类型(第 9.4 节、第 18.2 节)。基接口本身不能是类型参数,尽管它可以涉及范围内的类型参数。

还有第 §15.2.4.2 节

<块引用>

在类声明中指定的基类可以是构造类类型(第 9.4 节)。基类本身不能是类型参数(第 9.5 节),但它可以涉及范围内的类型参数。

相关问题