在没有警告的情况下隐藏基类的显式接口实现的预期目的?

Ask*_* B. 5 c# polymorphism interface

想象一下这些规范来自外部 dll。显式实现接口的类:

public interface IDebug
{
    string GetImportantInfo();
}
public class ExternalClass : IDebug
{
    public void DoSomethingImportant()
    {
        System.Diagnostics.Debug.WriteLine("Something important was done...");
    }
    string IDebug.GetImportantInfo() //Explicit implementation
    {
        DoSomethingImportant();
        return nameof(ExternalClass);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后这个来自内部代码,你知道你需要实现接口:

public class Debug : ExternalClass, IDebug
{
    public string GetImportantInfo()
    {
        return nameof(Debug);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我从子类调用Debug'sGetImportantInfo()方法时,不会调用超类中的显式实现:

static void Main(string[] args)
{
    IDebug test = new Debug();
    var impInfo = test.GetImportantInfo();
    System.Diagnostics.Debug.WriteLine(impInfo); //"Debug"
}
Run Code Online (Sandbox Code Playgroud)

我似乎得到的唯一轻微提示是,在将IDebug接口添加到Debug类时,没有实现该方法,我没有收到编译错误:

public class Debug : ExternalClass, IDebug
{
}
Run Code Online (Sandbox Code Playgroud)

为什么在像这样覆盖超类的实现时没有编译警告?如果基类隐式实现它,我会收到一个编译警告,告诉我使用new关键字。但是使用new关键字覆盖显式实现的方法会给出编译警告:

成员“Program.Debug.GetImportantInfo()”不会隐藏继承的成员。不需要 new 关键字。

是否有预期目的,或者这是一个错误?如果是有意的,官方的理由是什么?

Pab*_*sso 0

如果您使用显式实现,则在不转换为接口的情况下,方法在类中不可见。您将无法致电

new ExternalClass().GetImportantInfo()
Run Code Online (Sandbox Code Playgroud)

但你可以打电话

((IDebug)new ExternalClass()).GetImportantInfo();
Run Code Online (Sandbox Code Playgroud)

由于显式实现 new 关键字是不必要的。您甚至可以在一个类中添加两种实现:

    public class ExternalClass : IDebug
    {
        string IDebug.GetImportantInfo() //Explicit implementation
        {
            return "Explicit";
        }
        public string GetImportantInfo() 
        {
            return nameof(ExternalClass);
        }
    }
Run Code Online (Sandbox Code Playgroud)

此外,您的 Debug 类不必继承 IDebug 接口,因为它继承了ExternalClass。Resharper 会向您显示这是多余的。