如果"=="运算符被重载以与几种类类型进行比较,我应该如何使用"== null"

And*_*rko 4 .net c#

我有类"A",它重载"=="运算符以允许实例与同一类"A"的实例和类"B"的实例进行比较.

它工作正常,但当我尝试使用"== null"(比较"A"类实例为null)编译器抛出错误:

Ambiguous invocation:
  bool == (A, A)
  bool == (A, B)
Run Code Online (Sandbox Code Playgroud)

是否有可能以某种方式重构类以使"== null"可编辑或者ReferenceEquals是唯一的选择(有趣,但"Yoda条件"null == A-class-instance工作正常)

Jon*_*eet 9

最简单的方法就是施放:

if (a == (A) null)
Run Code Online (Sandbox Code Playgroud)

假设您调用重载运算符.如果要比较引用相等性,可以使用以下任一方法:

if (a == (object) null)
if (ReferenceEquals(a, null))
Run Code Online (Sandbox Code Playgroud)

就个人而言,我会选择第二个 - 我发现它更明确,更清晰.

我对逆转版本工作原理的猜测是没有超载==(B, A).

就个人而言,无论如何我都会避免重载==这对于不同类型的实例进行比较是非常不寻常的,特别是使用==.如果操作员没有对称地过载,情况会更糟:

bool x = (a == b);
bool y = (b == a);
Run Code Online (Sandbox Code Playgroud)

如果x并且y可以在这里有不同的价值,你真的要求一个痛苦的世界和难以发现的错误.只是不要这样做......