使用接口继承时为什么动态绑定失败?

时间:2012-03-10 17:47:38

标签: c# c#-4.0 inheritance dynamic interface

在C#中,有谁知道为什么我不能做以下事情? (特别是下面标有“不好!”的行

interface A
{
    void Add(dynamic entity);
}

interface B : A {}

class C : B
{
    public void Add(dynamic entity)
    {
        System.Console.WriteLine(entity);
    }
}

class Program
{
    static void Main(string[] args)
    {
        B b = new C();
        dynamic x = 23;
        b.Add(23);        // fine
        b.Add((int)x);    // fine
        (b as A).Add(x);  // fine
        //b.Add(x);       // NOT fine!
    }
}

如果调用没有动态绑定,或者我显式地转换到层次结构根目录下的接口,那么我绝对没有问题,但动态绑定调用给了我:

Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: No overload for method 'Add' takes '1' arguments
   at CallSite.Target(Closure , CallSite , B , Object )
   at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1)
   at Program.Main(String[] args) in C:\Users\Stuart\Documents\Visual Studio 2010\Projects\CSharp Testbed\Program.cs:line 218

2 个答案:

答案 0 :(得分:12)

查看Microsoft Connect将其作为错误提交 - Dynamic runtime fails to find method from a base interface during runtime

答案 1 :(得分:0)

看起来接口继承的多个层正在传递动态类型变量。它肯定会绊倒运行时绑定。

此时,如果您希望将其投入使用,可能的解决方法是:

dynamic x = 23;
b.Add((object)x);

dynamic y = "Hello, World!";
b.Add((object)y);

由于IL将动态视为对象,因此将所有内容明确地转换为类型对象将使这对您有用。