【发布时间】:2012-03-10 17:47:37
【问题描述】:
在 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
【问题讨论】:
-
顺便说一句,即使没有钻石继承,最后一次调用也会失败。
-
@YuriyGuts:一个最小的可编译示例就这么多吧? :) 好的,在这种情况下简化问题。
-
+1 - 请注意
b.Add((int)x)有效。 -
这可能是因为性能问题。如果可能的话,运行时应始终检查由
class或interface实现的所有接口,以查看是否有更好的调用匹配。通常大部分工作将在编译期间完成。 -
在 Microsoft Connect 上查看它已作为错误提交 - Dynamic runtime fails to find method from a base interface during runtime
标签: c# c#-4.0 inheritance dynamic interface