8

一些上下文代码:

class a
{

}

class b
{
    public a a{get;set;}
    public static implicit operator a(b b)
    {
        return b.a;
    }
}

  a a=null;
  b b=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; 

作品?

4

5 回答 5

17

implicit运算符仅适用于赋值。

您想重载等式 ( ==) 运算符,如下所示:

class a
{
    public static bool operator ==(a x, b y)
    {
        return x == y.a;
    }

    public static bool operator !=(a x, b y)
    {
        return !(x == y);
    }
}

class b
{
    public a a{get;set;}
    public static implicit operator a(b b)
    {
        return b.a;
    }
}

然后,这应该允许您比较两个类型的对象,ab按照您的帖子中的建议。

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

笔记:

正如编译器警告的那样,我建议简单地覆盖GetHashCodeandEquals方法,但是当您似乎想要抑制它们时,您可以按如下方式进行操作。

将您的类声明更改a为:

#pragma warning disable 0660, 0661
class a
#pragma warning restore 0660, 0661
{
    // ...
}
于 2009-05-21T09:26:57.593 回答
12

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

是的。

我错过了什么?

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

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

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

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

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

我想你也错过了这一点:

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

于 2009-05-21T15:37:42.760 回答
1

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

public static bool operator ==(a a, b b)
    {
        //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 实现,并确保该实现执行您需要的类型转换。

于 2009-05-21T09:27:06.017 回答
0

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

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

于 2009-05-21T09:24:05.837 回答
-1

用这个

 bool c = a.Equals(b);
于 2009-05-21T09:23:00.737 回答