小编典典

C#:将null传递给重载方法-调用哪个方法?

c#

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

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

我用以下方法调用该方法:

Method( null );

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


阅读 256

收藏
2020-05-19

共1个答案

小编典典

这取决于TypeATypeB

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

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

这是一个模棱两可的例子。这是TypeB从派生的TypeA,这意味着存在从TypeB到的隐式转换TypeA,反之亦然。因此,使用了重载使用TypeB

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);

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

2020-05-19