2

当我尝试使用抽象类实现嵌套接口时,我在 C# 4.0 中偶然遇到了这个问题:

public class A
{
    public interface InnerInterface
    {
        void Method();
    }
}

public abstract class B : A.InnerInterface
{
    public abstract void A.InnerInterface.Method();
}

public class C : B
{
    public override void A.InnerInterface.Method()
    {
        System.Console.WriteLine("C::A.InnerInterface.Method()");
    }
}

不幸的是,上面的代码无法编译,出现以下错误:

错误 CS0106:修饰符“抽象”对此项无效

错误 CS0106:修饰符“public”对此项目无效

错误 CS0106:修饰符“覆盖”对此项无效

错误 CS0106:修饰符“public”对此项目无效

但是,如果接口是非嵌套接口,如下所示:

public interface SomeInterface
{
    void Method();
}


public abstract class B : SomeInterface
{
    public abstract void Method();
}

public class C : B
{
    public override void Method()
    {
        System.Console.WriteLine("C::Method()");
    }
}

它编译好。

为什么在第一种情况下编译器错误?我在这里错过了什么吗?还是不允许用抽象类实现嵌套接口?

4

1 回答 1

2

问题不在于嵌套 - 它与显式接口实现有关。如果您将“工作”示例更改为使用:

public abstract void SomeInterface.Method()

你会看到同样的问题。您应该能够轻松地使用带有嵌套接口的隐式接口实现:

public abstract class B : A.InnerInterface
{
    public abstract void Method();
}

public class C : B
{
    public override void Method()
    {
        System.Console.WriteLine("C::A.InnerInterface.Method()");
    }
}

...如果你使用显式接口实现,它应该以与非嵌套接口相同的方式工作。但是您不会写public显式接口实现,它们也不能是抽象的(IIRC)。

于 2012-09-10T04:02:19.200 回答