重载null歧义

我有以下方法:

void Method(string param1, string param2); void Method(string param1, object param2); 

当我使用以下方法调用该方法时:

  method("string", null); 

它给出了一个错误,因为调用是模糊的,编译器不知道要调用哪个版本,因为两个方法都接受null作为第二个参数。

如何在不更改其中一个方法名称的情况下克服此问题? 第一个方法永远不会为null

问题是stringobject都可以为空,因此null可以引用方法的重载。 你必须抛出空值 – 就像听起来一样愚蠢 – 明确地说要调用哪个超载。

 method("string", (string) null); method("string", (object) null); 

这基本上与定义任一类型的变量并传递的相同:

 string param1 = null; object param2 = null; method("string", param1); // will call the string overload method("string", param2); // will call the object overload 

param1param2都具有相同的值null ,但变量的类型不同,这就是编译器能够确切地告诉它需要使用哪个重载的原因。 上面使用显式强制转换的解决方案是一样的; 它将一个类型注释为null值,然后用于推断正确的重载 – 只需要声明一个变量。

您可以通过指定要传递的null类型来具体说明要调用的方法版本:

 Method("string", null as string);