c#:是否可以使用私有内部接口?
本文关键字:内部 接口 是否 可以使 | 更新日期: 2023-09-27 18:13:31
我有一个通用类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)
基本上很清楚,泛型类型的内部类型需要外部类型的类型参数。是否有一种方法可以使此代码正确编译?
编辑:看起来这可以在Roslyn/c# 6技术预览版上编译,但不能在MS c# 5编译器或mono编译器上编译。
是的,就像这样-但请注意,实际上内部的T
在许多方面是不必要的,如果您保留它-将其命名为TInner
或其他东西以避免混淆将是有用的,因为X<T>
中的T
在技术上是与X<>.IX<T>
不同的东西,即使它们在实践中始终是相同的实际类型:
class X<T> : X<T>.IX<T>
{
private interface IX<out TInner>
{ // the private covariant interface
void foo();
}
// It grants access to the private method `foo`
private T foo() { throw new NotImplementedException(); }
void X<T>.IX<T>.foo() { throw new NotImplementedException(); }
private static void someMethod(IX<T> x)
{
// Here I can use `x` covariantly
}
}
为了使其编译并限制接口仅对程序集的可见性,您可以将其标记为内部。问题是,如果它被声明为内部类型,它将不会被你的类看到。下面的代码应该可以工作:
internal interface IX<out T> // the private covariant interface
{
T foo();
}
class X<T> : IX<T>
{
// It grants access to the private method `foo`
private T foo(){ return default(T); }
T IX<T>.foo(){ return foo(); }
private static void someMethod(IX<T> x)
{
// Here I can use `x` covariantly
}
}
这样接口仍然是私有的,但是因为它不再是一个内部类型,所以它可以在你的类中使用。