Используйте явные реализации интерфейса с динамическим объектом

Я экспериментирую с явным внедрением интерфейсов. Это необходимо для удаления смысла с помощью методов, которые не действительны в текущем контексте. использование/ практические-приложения-оф-адаптивного-интерфейс-паттерн-на-беглого-строитель контекста / как ссылки. Чтобы доказать, что они не будут вызываться, я подумал, что могу использовать ключевое слово dynamic, потому что тогда, по крайней мере, мой код скомпилируется. Он компилируется, но работает не так, как ожидалось. Динамическая переменная имеет доступ к методам класса, но не к методам интерфейса, которые реализованы явно.

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

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

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

И вот 3 теста, чтобы доказать мою точку зрения

[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();
}

Будет ли кто-нибудь достаточно любезен, чтобы объяснить причину этого? Одним из примеров, где я хотел эту функциональность, было доказательство того, что я не могу добавить более двух игроков в TennisGame.

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

Ответы на вопрос(1)

Ваш ответ на вопрос