使用接口inheritance时,为什么动态绑定失败?

在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 

查看Microsoft Connect将其作为错误提交 – 动态运行时无法在运行时从基接口查找方法

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

此时,如果您希望让它工作,可能的解决方法是:

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

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