【问题标题】:Overloading null ambiguity重载零歧义
【发布时间】:2014-01-27 22:23:37
【问题描述】:

我有以下方法:

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

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

  method("string", null);

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

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

【问题讨论】:

  • 两者都可以肯定有null;但是使用 null 调用特定变量的一种简单方法是创建特定类型的 null 变量。
  • 尝试这样称呼它:method("string", (string)null);或方法(“字符串”,(对象)空);
  • 您使用的是哪个版本的 .NET。因为没有歧义。规范对重载分辨率非常明确。
  • 正如@HamletHakobyan 所说,您的示例不应导致歧义。那是因为每个string 都是object,但不是每个object 都是string,所以它不是对称的,在这种情况下“最具体”的重载,这里Method(string, string) 是首选。你的真实情况可能不同。例如,如果重载是 Method(string, string)Method(string, Uri),它不明确。

标签: c# methods overloading


【解决方案1】:

问题在于stringobject 都可以为空,因此null 可以引用方法的任一重载。您必须强制转换 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 值,然后用于推断正确的重载——无需声明变量。

【讨论】:

  • 谢谢.. 这像黑客吗?或者这是克服这个问题的常用方法?
  • 不,这不是 hack。它只是通过明确说明您指的是哪个版本来明确告诉编译器您要调用哪个重载。
  • 这种方式至少可以让您避免 R# 警告,而不是我喜欢的仅使用 string empty = null; 等的方式。
【解决方案2】:

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

Method("string", null as string);

【讨论】:

    猜你喜欢
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2013-08-29
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多