C#中的方法重载和动态关键字

3

我还没有升级到4.0版本,否则我会自己检查代码片段。但我希望一些专家能够对此发表评论。

在下面的代码中,适当的Print()方法是否会在运行时被调用?在C# 2010中这样调用合法吗?

public void Test()
{
    dynamic objX = InstantiateAsStringOrDouble();

    Print(objX);
}

public void Print(string s)
{
    Console.Write("string");
}

public void Print(double n)
{
    Console.Write("double");
}

谢谢!


你想如何决定调用哪个Print函数?我认为最好多了解一下“动态”的相关知识。 - David Heffernan
当然是在运行时。感谢您的建议,我已经在这样做了! :-) - Vishal Seth
1
它确实可以工作,但要小心动态。它可以解决很多问题,同时也会给你带来很多头痛 :-) 基本上你获得了运行时的灵活性,但失去了所有编译器时间检查。 - James Michael Hare
2个回答

3

是的,实际上这是可行的。它会在运行时检查动态使用,并调用适当的方法,但你将失去几乎所有的编译时检查,所以请确保这确实是你想要做的。


谢谢詹姆斯。我正在尝试转换的代码有3-4个层次的方法调用,传递装箱对象参数。我考虑编写重载方法,但这就像一些if-else逻辑,然后是一个方法调用,更多的if-else逻辑,然后又是另一个方法调用(传递从上面2-3级获取的相同对象参数)... ...这是一种非常麻烦的遗留代码。在底部的某个地方,它检查对象是否为ArrayList或HashTable或其他什么东西,并相应地采取行动。 - Vishal Seth

2

是的,你甚至可以这样做:

public dynamic InstantiateAsStringOrDouble() { return 0.5; }

或者

public dynamic InstantiateAsStringOrDouble() { return "hello"; }

这样做,它将按预期工作。


2
当然,“public dynamic ... { return true; }”可能不起作用。 - Lasse V. Karlsen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接