无法过载!=,错误3操作员 'ConsoleApplication13.pl.operator!=(ConsoleApplication13.pl, ConsoleApplication13.pl)'还需要匹配的运算符'==' 定义了C:\ Users \ htg \ documents \ visual studio 2013 \ Projects \ ConsoleApplication13 \ ConsoleApplication13 \ Program.cs 37 28 ConsoleApplication13。
Error in .h2o.__checkConnectionHealth() :
H2O connection has been severed. Cannot connect to instance at http://127.0.0.1:54321/
Failed to connect to 127.0.0.1 port 54321: Connection refused
答案 0 :(得分:1)
是 - C#要求如果您重载!=
运算符,则还会重载==
运算符。从C#5规范,第10.10.2节:
某些二元运算符需要成对声明。对于一对运算符的每个声明,必须存在该对的另一运算符的匹配声明。当两个运算符声明具有相同的返回类型且每个参数的类型相同时,它们匹配。以下运算符需要成对声明:
- 运营商
==
和运营商!=
- 运营商
>
和运营商<
- 运营商
>=
和运营商<=
在这种情况下,它看起来像你想要的那样:
public static bool operator ==(pl m, pl n)
{
if (ReferenceEquals(m, n))
{
return true;
}
if (ReferenceEquals(m, null) || ReferenceEquals(n, null))
{
return false;
}
return m.mark == n.mark;
}
public static bool operator !=(pl m, pl n)
{
return !(m == n);
}
请注意!=
如何实现==
- 这几乎是始终实现这些运算符的最简单方法。完全实施==
,因为它更容易根据积极因素进行思考,然后将!=
作为反向实施。执行ReferenceEquals
检查表示null == null
为真,但任何非null都不等于null。 (这也是一种常见的优化方法,可确保x == x
成立,而无需进行任何进一步的测试。)
正如评论中所述,如果没有也覆盖==
和!=
,那么重载GetHashCode
和Equals(object)
也是非常不寻常的;我还建议实施IEquatable<T>
。您应该实现那些与==
运算符兼容的方法 - GetHashCode
方法可能最好只返回mark
。
答案 1 :(得分:1)
实施!=
时,您必须实施==
;强烈建议您覆盖Equals
和GetHashCode
:
class pl {
public int mark;
...
public override bool Equals(object obj) {
pl other = obj as pl;
return Object.ReferenceEquals(null, other) ? false : mark == other.mark;
}
public override int GetHashCode() {
return mark;
}
public static Boolean operator ==(pl left, pl right) {
// what if left or right or both are null?
if (Object.ReferenceEquals(left, right))
return true;
else if (Object.ReferenceEquals(left, null))
return false;
else if (Object.ReferenceEquals(null, right))
return false;
return left.mark == right.mark;
}
public static Boolean operator !=(pl left, pl right) {
return ! (left == right);
}
}