C#的隐式转换和==操作符
-
23-08-2019 - |
题
有关上下文的一些代码:
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;
}
}
这应该然后允许你比较类型a
和b
的两个对象为在您的文章建议。
var x = new a();
var y = new b();
bool c = (x == y); // compiles
注意:强>
我recommmend只需重写GetHashCode
和Equals
方法,因为编译器警告,但你似乎要剿他们,你可以做如下。
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);