繁体   English   中英

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

[英]C# - Generic interface that extends generic parameter

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

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

public interface IInsecurableService<T>: T { }

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

定义 CLR 的ECMA-335明确排除了这种情况,并给出了理由(第 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> ,我们处于同样的情况,对基类/接口定义一无所知。 结束理由]


定义 C# 语言规范的ECMA-334也将其排除在外(第 18.2.4 节):

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

还有第 §15.2.4.2 节

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM