假设我有两个C#方法的重载版本:

void Method( TypeA a ) { }
void Method( TypeB b ) { }

我用以下方法调用该方法:
Method( null );

调用该方法的哪个重载?我该怎么做才能确保调用特定的重载?

最佳答案

它取决于TypeATypeB

  • 如果恰好适用其中一种(例如,由于null是一种值类型,但没有从TypeB转换为TypeA,则TypeA是引用类型),则会调用该适用的方法。
  • 否则,这取决于TypeBTypeA之间的关系。
  • 如果存在从TypeBTypeB的隐式转换,但是没有从TypeATypeA的隐式转换,那么将使用使用TypeB的重载。
  • 如果存在从TypeATypeA的隐式转换,但是没有从TypeBTypeB的隐式转换,那么将使用使用TypeB的重载。
  • 否则,该调用将不明确,并且将无法编译。

  • 有关详细规则,请参见C#3.0规范的7.4.3.4节。

    这是一个模棱两可的例子。这里TypeA源自TypeB,这意味着存在从TypeATypeB的隐式转换,但反之亦然。因此,使用了ojit_code的重载:
    using System;
    
    class TypeA {}
    class TypeB : TypeA {}
    
    class Program
    {
        static void Foo(TypeA x)
        {
            Console.WriteLine("Foo(TypeA)");
        }
    
        static void Foo(TypeB x)
        {
            Console.WriteLine("Foo(TypeB)");
        }
    
        static void Main()
        {
            Foo(null); // Prints Foo(TypeB)
        }
    }
    

    通常,即使面对另一个模棱两可的调用,也要确保使用特定的重载,只需进行强制转换:
    Foo((TypeA) null);
    

    或者
    Foo((TypeB) null);
    

    请注意,如果这涉及到声明类中的继承(即一个类正在重载由其基类声明的方法),那么您将陷入另一个问题,您需要转换方法的目标而不是参数。

    10-05 21:23