有关上下文的一些代码:

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; 

作品?

有帮助吗?

解决方案

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

注意:

我recommmend只需重写GetHashCodeEquals方法,因为编译器警告,但你似乎要剿他们,你可以做如下。

a的类声明更改为:

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

其他提示

  

是否有可能上使用==操作符   不同类型的实例,其中一个   可以隐式转换为另一种?

  

我错过了什么?

下面是本说明书的相关部分。你错过了高亮显示的单词。

  

预定义的引用类型相等   运营商要求[即]两个操作数   是引用类型值或   字面空。此外,一个标准   隐式转换从存在   一个操作数的类型的类型   另一个操作数。

一个用户定义的转换是通过定义不是一个标准转换。这是引用类型。因此,预定义的引用类型相等运算不是候选。

  

如果类型必须相同的调用==,   那么,为什么[双== INT]作品?

您假设该类型必须是相同的不正确。有从int一个标准隐式转换到加倍并有相等运算符采用两个双打,所以此工程。

我想你也错过了这一点:

  

它是使用一个编译时间错误   预定义的引用类型相等   运算符来比较两个引用   已知是在不同   编译时间。例如,如果   操作数的编译时类型   2类类型A和B,并且如果   A和B都不从所述派生   其他的,那么这将是不可能的   两个操作数引用同一   宾语。因此,操作是   认为是编译时间错误。

我可以想象你需要精确的重载==操作符对你感兴趣的类型,无论编译/运行时仍然会抱怨,即使类型是含蓄可转换的东西,你不得不尝试着用。

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);
        }
    }

或者只是使用类似的Equals实现ole6ka建议,并确保实施确实需要的类型转换。

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

  

在每一种情况下,一个参数必须是   相同类型的类或结构   声明操作者(...)

使用此

 bool c = a.Equals(b);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top