C#隐式转换和==运算符

上下文的一些代码:

class a { } class b { public aa{get;set;} public static implicit operator a(bb) { return ba; } } aa=null; bb=null; a = b; //compiler: cannot apply operator '==' to operands of type tralala... bool c = a == b; 

是否可以在不同的类型实例上使用==运算符,其中一个可以隐式转换为另一个? 我错过了什么?

编辑:
如果类型必须是相同的调用==,那么为什么

 int a=1; double b=1; bool c=a==b; 

作品?

implicit运算符仅适用于赋值。

您希望重载相等( == )运算符,如下所示:

 class a { public static bool operator ==(ax, by) { return x == ya; } public static bool operator !=(ax, by) { return !(x == y); } } class b { public aa{get;set;} public static implicit operator a(bb) { return ba; } } 

这应该允许您比较post中建议的两个类型ab对象。

 var x = new a(); var y = new b(); bool c = (x == y); // compiles 

注意:

我建议简单地重写GetHashCodeEquals方法,因为编译器警告,但是你似乎想要压制它们,你可以这样做。

将您的类声明更改为:

 #pragma warning disable 0660, 0661 class a #pragma warning restore 0660, 0661 { // ... } 

是否可以在不同的类型实例上使用==运算符,其中一个可以隐式转换为另一个?

是。

我错过了什么?

这是规范的相关部分。 你错过了突出显示的单词。

预定义的引用类型相等运算符要求两个操作数都是引用类型值或文字空值。 此外,从操作数的类型到另一个操作数的类型存在标准的隐式转换。

根据定义,用户定义的转换不是标准转换。 这些是参考类型。 因此,预定义的引用类型相等运算符不是候选者。

如果类型必须是相同的调用==,那么为什么[double == int]有效?

您认为类型必须相同的假设是不正确的。 有一个从int到double的标准隐式转换,并且有一个带有两个双精度的相等运算符,所以这是有效的。

我想你也错过了这一点:

使用预定义的引用类型相等运算符来比较两个在编译时已知不同的引用是一个编译时错误。 例如,如果操作数的编译时类型是两个类类型A和B,并且如果A和B都不是从另一个派生,则两个操作数不可能引用同一个对象。 因此,该操作被认为是编译时错误。

我想你需要实际覆盖你感兴趣的类型的==运算符。即使类型是可转换的,编译/运行时是否仍会抱怨是你必须要试验的东西。

 public static bool operator ==(aa, bb) { //Need this check or we can't do obj == null in our Equals implementation if (((Object)a) == null) { return false; } else { return a.Equals(b); } } 

或者,只需使用像ole6ka建议的Equals实现,并确保实现执行您需要的类型转换。

http://msdn.microsoft.com/en-us/library/8edha89s.aspx

在每种情况下,一个参数必须与声明运算符的类或结构相同(…)

用这个

  bool c = a.Equals(b);