Warum fügt der C # -Compiler eine explizite Schnittstellenimplementierung ein?

Ich bin auf einen seltsamen C # -Kantenfall gestoßen und suche nach einer guten Lösung.

Es gibt eine Klasse, die ich nicht steuere und die so aussieht:

namespace OtherCompany
{
    public class ClassIDoNotControl
    {
        public void SomeMethod(string argument)
        {
            Console.WriteLine((new StackFrame(1).GetMethod().Name));
        }
    }
}

Ich möchte von dieser Klasse in einer Klasse erben, die ichtu Steuerung. Außerdem möchte ich eine Schnittstelle angeben:

interface IInterfaceIDoControl
{
    void SomeMethod(string argument);
}

class ClassIDoControl : OtherCompany.ClassIDoNotControl, IInterfaceIDoControl
{
}

Wenn sich alle diese Dateien in derselben Assembly befinden, funktioniert alles hervorragend:

namespace MyCompany
{
    class Program
    {
        static void Main(string[] args)
        {
            IInterfaceIDoControl i = new ClassIDoControl();
            i.SomeMethod("Hello World!"); // Prints "Main"
        }
    }
 }

Aber wenn ich "ClassIDoNotControl" in eine andere Assembly verschiebe, erhalte ich nicht das, was ich erwartet habe. Stattdessen wird "MyCompany.IInterfaceIDoControl.SomeMethod" für die Ausgabe angezeigt, die einen zusätzlichen Stapelrahmen impliziert.

Der Grund dafür ist, dass der C # -Compiler "ClassIDoControl" dahingehend ändert, dass es folgendermaßen aussieht:

class ClassIDoControl : OtherCompany.ClassIDoNotControl, IInterfaceIDoControl
{
    void IInterfaceIDoControl.SomeMethod(string argument)
    {
        base.SomeMethod(argument);
    }
}

Gibt es eine Möglichkeit, diese vom Compiler generierte zusätzliche Indirektionsebene mit explizit implementierten Schnittstellen zu vermeiden?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage