上下文的一些代码:
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;
作品?
答案 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;
}
}
然后,您应该按照帖子中的建议比较两个a
和b
类型的对象。
var x = new a();
var y = new b();
bool c = (x == y); // compiles
注意:强>
我建议简单地覆盖GetHashCode
和Equals
方法,正如编译器警告的那样,但是你似乎想要压制它们,你可以这样做。
将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);