【发布时间】:2015-07-13 02:26:54
【问题描述】:
为什么我不能用dynamic 和object 参数重载方法。
void Method(dynamic arg) // Member with same signature is already declared
{
Console.WriteLine("Dynamic");
}
void Method(object arg) // Member with same signature is already declared
{
Console.WriteLine("Not Dynamic");
}
但我可以重载 Method 与 dynamic 和另一种类型 except 对象或动态它自己。
void Method(dynamic arg)
{
Console.WriteLine("Dynamic");
}
void Method(string arg)
{
Console.WriteLine("Not Dynamic");
}
正如您在第一个示例中看到的,编译器无法区分两个重载。
我认为第二个示例也不应该工作,因为字符串可以发送到两个重载。但是编译器更喜欢调用已知类型的重载。
我已经做了一些测试,看看它实际上是如何工作的。
Method(""); // Prints: Not Dynamic
Method((dynamic)""); // Prints: Not Dynamic
Method(null); // Prints: Not Dynamic
Method(???); // Dynamic for any other type except string and null.
考虑第一个示例作品,编译器会这样决定:
Method(new object());// Prints: Not Dynamic
Method((object)5); // Prints: Not Dynamic
Method(???); // Prints: Dynamic for any other type except object and null.
那么编译器的困惑在哪里?为什么我不能有这样的重载?
【问题讨论】:
-
动态的默认类型是
object。 (MSDN) -
谢谢。现在说得通了。我以为我们有动态类型。但实际上我们没有。这就是为什么我不能使用
typeof(dynamic)并且默认类型是对象。答案。 @AVD
标签: c# object dynamic overloading