无法过载!=操作员因错误3而需要匹配的操作员?

时间:2015-12-04 07:10:31

标签: c# .net

  

无法过载!=,错误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

2 个答案:

答案 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成立,而无需进行任何进一步的测试。)

正如评论中所述,如果没有覆盖==!=,那么重载GetHashCodeEquals(object)也是非常不寻常的;我还建议实施IEquatable<T>。您应该实现那些与==运算符兼容的方法 - GetHashCode方法可能最好只返回mark

答案 1 :(得分:1)

实施!=时,您必须实施==;强烈建议您覆盖EqualsGetHashCode

  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);
    }
  }
相关问题