重载null歧义

时间:2014-01-27 22:23:37

标签: c# methods overloading

我有以下方法:

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

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

  method("string", null);

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

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

2 个答案:

答案 0 :(得分:15)

问题是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值,然后用于推断正确的重载 - 无需声明变量。

答案 1 :(得分:2)

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

Method("string", null as string);