Użyj jawnych implementacji interfejsu z dynamicznym obiektem

Eksperymentuję z jawnymi wszczepieniami interfejsów. Ma to na celu pozbycie intellisense metod, które nie są poprawne w obecnym kontekście. Posługiwać się/ praktyczne-zastosowania-adaptacyjnego-interfejsu-wzorca-płynnego-budowniczego-kontekst / jako odniesienie. Aby udowodnić, że nie będą możliwe do wywołania, pomyślałem, że mogę użyć dynamicznego słowa kluczowego, ponieważ wtedy przynajmniej mój kod się skompiluje. Kompiluje się, ale nie działa zgodnie z oczekiwaniami. Zmienna dynamiczna ma dostęp do metod klas, ale nie do metod interfejsu, które są jawnie zaimplementowane.

public interface IAmInterface
{
    void Explicit();
    void Implicit();
}

public class Implementation : IAmInterface
{
    void IAmInterface.Explicit()
    {
    }

    public void Implicit()
    {
    }
    public static Implementation BeginBuild()
    {
        return new Implementation();
    }
}

A oto trzy testy, które udowodnią moją rację

[Test]
public void TestWorksAsExpected() //Pass
{
    var o = Implementation.BeginBuild();
    o.Implicit();
}

[Test]
public void TestDoesNotWorkWithExplicitImplementation() //Fails
{
    dynamic o = Implementation.BeginBuild();
    o.Explicit();
}

[Test]
public void ButWorksForImplicitImplementation() //Pass
{
    dynamic o = Implementation.BeginBuild();
    o.Implicit();
}

Czy ktoś byłby na tyle uprzejmy, aby wyjaśnić powód tego? Jednym z przykładów, w których chciałem, aby ta funkcja była, było udowodnienie, że nie mogę dodać więcej niż dwóch graczy do gry w tenisa.

dynamic o = TennisGame.BeginBuild().With("Player A").Versus("Player B");
o.Versus("Player C"); //Should fail. It does, but for another reason

questionAnswers(1)

yourAnswerToTheQuestion