我有以下代码:
[TestMethod]
public void TestFoo()
{
Foo(null);
}
private void Foo (object bar)
{
Console.WriteLine("Foo - object");
}
private void Foo (string bar)
{
Console.WriteLine("Foo - string");
}
当我运行测试“TestFoo()”时,控制台输出为“Foo - string”。编译器如何决定调用哪种方法?
答案 0 :(得分:16)
它应用“更好的转换”规则(C#3规范的7.4.3.3)作为重载解析的一部分(一般见第7.4.3节)。
在这种情况下,基本上是从string
到object
的转换,但不是从object
到string
的转换。遵循规则,这意味着从null
到string
的转换优于从null
到object
的转换,因此string
参数的重载是使用
当涉及以下因素时,过载分辨率会变得非常复杂:
params
)添加到有趣的基本上,重载可以是一个真正的蠕虫 - 在可能的情况下,设计重载,以便只有其中一个将成为任何给定方法调用的有效目标,这样您就不必担心详细的规则。