【发布时间】:2014-09-09 08:22:01
【问题描述】:
我有一个通用类X<T>;这个类有一个协变部分,我希望能够协变地访问它。所以我把它分解成一个接口IX<out T>。但是,我希望这个接口只对类本身可见,因为它还包含被称为private 的方法。
即,在类本身内部,我可以向上转换为 IX<T> 并协变地使用它。例如:
class X<T> : IX<T> {
private interface IX<out T>{ // the private covariant interface
void foo();
}
// It grants access to the private method `foo`
private T foo(){...}
public T IX.foo(){ return foo(); }
private static void someMethod(IX<T> x) {
// Here I can use `x` covariantly
}
}
这可能吗?我以前从未听说过private 嵌套接口,因为私有接口通常毫无意义。但是,对于泛型,这样的接口对于实现“仅私有的协变”是必要的。
当我尝试编译它时,我收到以下错误:
foo.cs(1,14): error CS0246: The type or namespace name `IX' could not be found. Are you missing an assembly reference?
foo.cs(9,14): error CS0305: Using the generic type `X<T>.IX<S>' requires `1' type argument(s)
这基本上很清楚,泛型类型的内部类型需要外部类型的类型参数。有没有办法让这段代码正确编译?
【问题讨论】:
-
为什么不是私有类,而是接口?
-
@Tigran:因为一个类不能被声明为协变的,我可能想从另一个类继承。
-
你不能只声明你的内部接口,让它只在你的程序集中可见吗?
-
@Sahuagin:抱歉,忘记添加我的编译器的输出了 :)
-
@Brizio:这也可以,但不会授予我所针对的非常严格的访问限制。
标签: c# generics visibility covariance nested-class