假设我有两个C#方法的重载版本:
void Method( TypeA a ) { }
void Method( TypeB b ) { }
我用以下方法调用该方法:
Method( null );
调用该方法的哪个重载?我该怎么做才能确保调用特定的重载?
最佳答案
它取决于TypeA
和TypeB
。
null
是一种值类型,但没有从TypeB
转换为TypeA
,则TypeA
是引用类型),则会调用该适用的方法。 TypeB
和TypeA
之间的关系。TypeB
到TypeB
的隐式转换,但是没有从TypeA
到TypeA
的隐式转换,那么将使用使用TypeB
的重载。 TypeA
到TypeA
的隐式转换,但是没有从TypeB
到TypeB
的隐式转换,那么将使用使用TypeB
的重载。 有关详细规则,请参见C#3.0规范的7.4.3.4节。
这是一个模棱两可的例子。这里
TypeA
源自TypeB
,这意味着存在从TypeA
到TypeB
的隐式转换,但反之亦然。因此,使用了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);
请注意,如果这涉及到声明类中的继承(即一个类正在重载由其基类声明的方法),那么您将陷入另一个问题,您需要转换方法的目标而不是参数。