在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
答案 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将动态视为对象,因此将所有内容明确地转换为类型对象将使这对您有用。