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

时间:2009-05-21 09:13:05

标签: c# operators type-conversion equals-operator

上下文的一些代码:

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; 

作品?

5 个答案:

答案 0 :(得分:14)

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

注意:

我建议简单地覆盖GetHashCodeEquals方法,正如编译器警告的那样,但是你似乎想要压制它们,你可以这样做。

a的班级声明更改为:

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

答案 1 :(得分:11)

  

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

  

我错过了什么?

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

  

预定义的引用类型相等   运算符需要两个操作数   是引用类型值或   字面无效。此外,标准   存在隐式转换   类型的任一操作数的类型   另一个操作数。

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

  

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

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

我想你也错过了这一点:

  

使用它是一个编译时错误   预定义的引用类型相等   运营商比较两个参考   众所周知的是不同的   编译时间。例如,如果   编译时类型的操作数是   两个类类型A和B,如果   既不是A也不是B来源于   另外,那就不可能了   两个操作数引用相同   宾语。因此,操作是   被认为是编译时错误。

答案 2 :(得分:1)

我认为你需要实际覆盖你感兴趣的类型的==运算符。即使类型是可转换的,编译/运行时是否仍然会抱怨你需要进行实验。< / p>

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实现,并确保实现执行您需要的类型转换。

答案 3 :(得分:0)

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

  

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

答案 4 :(得分:-1)

使用此

 bool c = a.Equals(b);