2017-01-30 52 views
8

我有一个struct调用MyType,实现IEquatable<MyType>我应该重写==对象和MyType吗?

我实施了operator ==(MyType x, MyType y),但是我是否还应该在下面的情况下执行operator ==(MyType x, object y)

例如:

public static bool operator ==(MyType x, object y) 
{ 
    if (y is MyType) 
    { 
     return x == (MyType)y; 
    } 

    return false; 
} 

用法:

var a = new MyType(); 
object b = new MyType(); 

var result = (a == b); // ? 
+0

你可以添加一个如何使用这个操作符的例子吗? – HimBromBeere

+0

@HimBromBeere新增 – sdgfsdh

+2

@HimBromBeere - wouldnt一个'as' cast从不返回'null',因为它的'struct'? – Igor

回答

1

没有CTS类型做到这一点,据我所知。好例子包括十进制日期时间,它们只为它们各自的类型实现相等性,而不是它们的基类型或接口。

而且,这种实现可能会鼓励比较几乎任何类型与结构,甚至是其他结构,和别人谁可能会使用你的代码在未来可能会觉得比较的MyTypeMyOtherType可能是有意义的,而所有它会做拳击的另一种类型,然后返回false。此外,人们通常将object上的==解释为意指参考平等。

此外,你应该重载op_Equalityop_Inequality运营商。这可以确保所有的相等测试都能返回一致的结果。

documentation不知道哪个运营商的平等,你应该过载,而第二句话实际上可能MyType == object是与MyType.Equals(object)一致的条款进行解释。然而,事实上,没有.NET类型实际上这样做,并导致混淆,这足以说明这不是一个好习惯。

如果其他类型可以视为MyType,则重载显式或隐式转换。

相关问题