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)

基本上很清楚,泛型类型的内部类型需要外部类型的类型参数。是否有一种方法可以使此代码正确编译?

c#:是否可以使用私有内部接口?

编辑:看起来这可以在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
    }
}

这样接口仍然是私有的,但是因为它不再是一个内部类型,所以它可以在你的类中使用。