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

Dar*_*der 8 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");
    }
Run Code Online (Sandbox Code Playgroud)

当我运行测试"TestFoo()"时,控制台输出为"Foo - string".编译器如何决定调用哪种方法?

Jon*_*eet 16

它应用"更好的转换"规则(C#3规范的7.4.3.3)作为重载决策的一部分(一般见7.4.3节).

在这种情况下,基本上是转换stringobject,但不是转换objectstring.遵守规则,这意味着从转换nullstring比从一个更好的nullobject,所以用超负荷string使用的参数.

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

  • 候选集中可能存在泛型方法
  • 如果泛型方法,类型推断分别适用于每个人,给予不同的转换机会
  • 如果任何参数是方法组,它们可以转换为不同的委托类型 - 如果命名方法组有多个重载,甚至可能使用不同的方法签名
  • 继承可能会导致令人惊讶的结果
  • 参数数组(params)增添了乐趣
  • C#4中的可选参数也有助于做出决定

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