为什么编译器以以下方式限制重载方法,编译错误我在带有动态类型参数的更新方法中得到。
错误 - 类型"程序"已定义具有相同参数类型的名为"update"的成员
static void update(string name)
{
}
static void update(object name)
{
}
static void update(dynamic name)
{
}
当您使用dynamic
参数类型时,即
static void update(dynamic name)
{
}
编译器将方法的签名更改为使用object
,即
static void update(object name)
{
}
然后在方法主体中插入一些"魔术",以便name
视为动态类型对象。然而,这引入了一个重要的限制:你不能有另一种需要object
update
方法,因为你已经有一个。
从语言设计者的角度考虑这种重载:当你看到object
和dynamic
之间的重载调用时,将没有直观理解的方法来解决平局,因为object
和dynamic
都可以容纳任何类型的对象。因此,无论如何都应该禁止这样的重载,无论dynamic
的底层实现如何。
因为dynamic
也是一种object
。您可以检查生成的 IL 代码。所以它给出了编译错误
static void update(object name)
{
}
static void update(dynamic name)
{
}