代码之家  ›  专栏  ›  技术社区  ›  EggyBach

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

  •  8
  • EggyBach  · 技术社区  · 14 年前

    我有以下代码:

        [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 回复  |  直到 14 年前
        1
  •  16
  •   Jon Skeet    14 年前

    它应用“更好的转换”规则(C#3规范的7.4.3.3)作为过载解决方案的一部分(一般来说是第7.4.3节)。

    在这种情况下,基本上是从 string object ,但不是来自 对象 一串 . 按照规则,这意味着 null 一串 总比我的好 对象 ,所以 一串 使用参数。

    当涉及到以下因素时,过载解决会变得极其复杂:

    • 候选集中可能有泛型方法
    • 如果有
    • 如果任何参数是方法组,则可以将它们转换为不同的委托类型—如果指定的方法组
    • 遗传会导致令人惊讶的结果
    • 参数数组( params )增加乐趣
    • C#4中的可选参数也有助于决策

    基本上,重载可以是一个真正的蠕虫罐头-在可能的情况下,设计重载,使其中只有一个将永远是任何给定方法调用的有效目标,这样你就不需要担心详细的规则。