Al pasar un parámetro dinámico, se produce la excepción RuntimeBinderException al llamar a Método desde la interfaz Heredada

Se encontró con un problema de tiempo de ejecución interesante después de algunas refactorizaciones y se ha fijado en la siguiente situación.

Cuando se pasa una propiedad de un objeto dinámico a un método en una interfaz que se ha heredado de una interfaz principal, el enlazador de tiempo de ejecución no puede encontrar el método.

Aquí hay una prueba para demostrar tanto el fracaso como el éxito (cuando se llama al método directamente en el tipo de interfaz principal)

<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>

La prueba # 1 falla: Assert.AreEqual falló. Se espera: <(nulo)>. Real:. 'Test.Utility.IInheritEcho' no contiene una definición para 'EchoString'

Prueba # 2 tiene éxito.

Mi pregunta es si mi suposición de que la primera prueba debería aprobarse es correcta o si hay una razón fundamental en el marco que no lo hace.

Sé que puedo solucionar el problema cambiando los parámetros cuando los paso o asignándolos a variables antes de pasarlos. Tengo más curiosidad por saber por qué la interfaz heredada está causando que RuntimeBinder falle ...

Respuestas a la pregunta(2)

Su respuesta a la pregunta