当参数类型不明确时,编译器如何选择调用哪个方法?

时间:2010-04-23 06:31:05

标签: c# compiler-construction

我有以下代码:

    [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”。编译器如何决定调用哪种方法?

1 个答案:

答案 0 :(得分:16)

它应用“更好的转换”规则(C#3规范的7.4.3.3)作为重载解析的一部分(一般见第7.4.3节)。

在这种情况下,基本上是从stringobject的转换,但不是从objectstring的转换。遵循规则,这意味着从nullstring的转换优于从nullobject的转换,因此string参数的重载是使用

当涉及以下因素时,过载分辨率会变得非常复杂:

  • 候选集
  • 中可能有通用方法
  • 如果泛型方法,则会分别对每个方法应用类型推断,从而提供不同的转化机会
  • 如果任何参数是方法组,它们可以转换为不同的委托类型 - 如果命名方法组 还有多个重载,甚至可能使用不同的方法签名
  • 继承可能会导致令人惊讶的结果
  • 参数数组(params)添加到有趣的
  • C#4中的可选参数也有助于做出决定

基本上,重载可以是一个真正的蠕虫 - 在可能的情况下,设计重载,以便只有其中一个将成为任何给定方法调用的有效目标,这样您就不必担心详细的规则。