我在尝试扩展一个基类时注意到了一个意外的行为。以下是这个问题的一个示例:
如果我创建另一个继承类
我有一些代码:
public class Program
{
static void Main(string[] args)
{
var test = new CoolProgram();
test.Start();
}
private void Start()
{
var arr = new object[]
{
1, // int
1L, // long
"Hello World" // string
};
foreach (var dyn in arr.Cast<dynamic>())
{
DoSomething(dyn);
}
Console.ReadKey();
}
protected virtual void DoSomething(int i)
{
Console.WriteLine("Int:" + i);
}
protected virtual void DoSomething(string str)
{
Console.WriteLine("Str:" + str);
}
}
Program
定义了两个方法 DoSomething
,分别使用 int
和 string
参数进行重载。方法 Start
创建了一个对象数组,其中包含装箱的值。定义后,元素将使用强制转换的 `dynamic` 进行迭代。目前为止这样做是可以正常工作的(不包括长整型)。如果我创建另一个继承类
CoolProgram
并为类型添加了一个针对 long
的新方法,则程序将抛出 RuntimeBinderException
异常,并告诉我最佳匹配已经是 DoSomething(int)
。方法 CoolProgram
不会被执行。public class CoolProgram : Program
{
protected override void DoSomething(int i)
{
// This works
Console.WriteLine("Cool Int: " + i);
}
protected override void DoSomething(string str)
{
// This works
Console.WriteLine("Cool Str: " + str);
}
protected virtual void DoSomething(long i)
{
// This is a new method for long
Console.WriteLine("Long:" + i);
}
}
有人可以解释这种行为或者有解决方案吗?
dynamic
只是将类型解析和后续编译步骤推迟到运行时。因此,你真正想知道的是为什么重载解析会执行它正在执行的操作。 - Peter Duniho