当在传递动态对象的接口类型上调用继承的方法时,为什么会引发RuntimeBinderException?

时间:2018-09-24 16:48:19

标签: c# dynamic

能否请您解释一下此代码的行为:

namespace DynamicTesting
{
    public interface IDynamicTargetBase
    {
        string Hello(int a);
    }

    public interface IDynamicTarget : IDynamicTargetBase
    {
    }

    public class DynamicTarget : IDynamicTarget
    {
        public string Hello(int a)
        {
            return "Hello!";
        }
    }

    public class Program
    {
        public static void Main(string[] args)
        {
            dynamic a = 123;

            IDynamicTargetBase obj1 = new DynamicTarget();
            obj1.Hello(a);  // This works just fine

            IDynamicTarget obj2 = new DynamicTarget();
            obj2.Hello(a); // RuntimeBinderException "No overload for method 'Hello' takes '1' arguments"
        }
    }
}

结果是:

  

[Microsoft.CSharp.RuntimeBinder.RuntimeBinderException:方法'Hello'的重载不带有'1'参数]      在CallSite.Target(Closure,CallSite,IDynamicTarget,Object)      在System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2 [T0,T1](CallSite站点,T0 arg0,T1 arg1)      在DynamicTesting.Program.Main(String [] args)处:第30行

如果我使用int而不是dynamic,那么它工作正常。 我不明白为什么它不起作用。你有什么想法吗?

自行尝试:https://dotnetfiddle.net/55ZMAG

0 个答案:

没有答案