首页 > 解决方案 > 为什么在传递动态对象的接口类型上调用继承方法时会引发 RuntimeBinderException?

问题描述

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

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' 参数] 在 System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite站点,T0 arg0,T1 arg1) 在 DynamicTesting.Program.Main(String[] args):第 30 行

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

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

标签: c#dynamic

解决方案


推荐阅读