Passar um parâmetro dinâmico gera RuntimeBinderException ao chamar o método da interface herdada

Corri para um problema de tempo de execução interessante após algumas refatorações e fixei-o na seguinte situação.

Ao passar uma propriedade de um objeto dinâmico para um método em uma interface que foi herdada de uma interface pai, o fichário de tempo de execução não pode encontrar o método.

Aqui está um teste para demonstrar a falha e o sucesso (ao chamar o método diretamente no tipo de interface pai)

<code>using System.Dynamic;
using Microsoft.CSharp.RuntimeBinder;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Test.Utility
{
    public interface IEcho
    {
        string EchoString(string input);
    }

    public interface IInheritEcho : IEcho
    { }

    public class EchoClass : IInheritEcho
    {
        public string EchoString(string input)
        {
            return input;
        }
    }

    [TestClass]
    public class RuntimeBinderTest
    {
        [TestMethod]
        public void RuntimeBinder_should_work_when_dynamic_parameters_are_passed_to_method_from_inherited_interface()
        {
            //Arrange
            dynamic dynObject = new ExpandoObject();
            dynObject.Foo = "Bar";
            IInheritEcho echomore = new EchoClass();

            string echo = null;
            string exceptionMessage = null;

            //Act
            try
            {
                echo = echomore.EchoString(dynObject.Foo);
            }
            catch (RuntimeBinderException e)
            {
                exceptionMessage = e.Message;
            }

            //Assert
            Assert.AreEqual(echo, dynObject.Foo, false, exceptionMessage);
        }

        [TestMethod]
        public void RuntimeBinder_should_work_when_dynamic_parameters_are_passed_to_method_from_noninherited_interface()
        {
            //Arrange
            dynamic dynObject = new ExpandoObject();
            dynObject.Foo = "Bar";
            IEcho echomore = new EchoClass();

            string echo = null;
            string exceptionMessage = null;

            //Act
            try
            {
                echo = echomore.EchoString(dynObject.Foo);
            }
            catch (RuntimeBinderException e)
            {
                exceptionMessage = e.Message;
            }

            //Assert
            Assert.AreEqual(echo, dynObject.Foo, false, exceptionMessage);
        }
    }
}
</code>

Falha no teste 1: Assert.AreEqual falhou. Esperado: <(null)>. Real:. 'Test.Utility.IInheritEcho' não contém uma definição para 'EchoString'

Teste # 2 é bem sucedido.

A minha pergunta é se a minha suposição de que o primeiro teste deve passar está correta ou se existe uma razão fundamental na estrutura que não está correta?

Eu sei que posso corrigir o problema, lançando os parâmetros quando eu passá-los ou atribuí-los a variáveis ​​antes de passá-los dentro Estou mais curioso apenas a razão pela qual a interface herdada está causando o RuntimeBinder a falhar ...

questionAnswers(2)

yourAnswerToTheQuestion