是否可以定义一个扩展接口的泛型参数的泛型接口?
例如(这不会编译,因为继承 T
是不可能的)
public interface IInsecurableService<T>: T { }
通过这种方式,我想将服务添加到具有某些功能的 DI 容器中,而没有扩展的相同服务仍然存在/仍然可以注册。
答案 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 节),但它可以涉及范围内的类型参数。