C# 无法过载!=由于错误3,运算符需要匹配的运算符吗?

C# 无法过载!=由于错误3,运算符需要匹配的运算符吗?,c#,.net,C#,.net,无法过载!=,错误3操作员 '控制台应用程序13.pl.operator=(控制台应用程序13.pl, ConsoleApplication13.pl)“”还需要一个匹配的运算符“==” 定义的C:\Users\htg\documents\visual studio 2013\Projects\ConsoleApplication13\ConsoleApplication13\Program.cs 37 28控制台应用程序13 是-如果您超载,C#要求=操作符,您还可以重载==操作符。根据C#5

无法过载!=,错误3操作员 '控制台应用程序13.pl.operator=(控制台应用程序13.pl, ConsoleApplication13.pl)“”还需要一个匹配的运算符“==” 定义的C:\Users\htg\documents\visual studio 2013\Projects\ConsoleApplication13\ConsoleApplication13\Program.cs 37 28控制台应用程序13

是-如果您超载
,C#要求=
操作符,您还可以重载
==
操作符。根据C#5规范第10.10.2节:

某些二进制运算符需要成对声明。对于一对运算符中任一运算符的每个声明,必须有该对运算符中另一个运算符的匹配声明。当两个运算符声明的返回类型和每个参数的类型相同时,它们将匹配。以下运算符需要成对声明:

  • 操作员
    ==
    和操作员
    =

  • 操作员
    和操作员
    =
    和操作员
    执行
    时=
    您还必须实现
    ==
    ;强烈建议重写
    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);
        }
      }
    

    重载时
    =您还必须重载
    ==
    ;强烈建议您重载
    Equals()
    GetHashcode()
    。另外,我强烈建议您避免使用公共字段,并在使用有意义的常规名称时多加努力。请阅读错误消息。它非常清楚地说明了操作员!=“还需要定义匹配运算符“==”。
    返回m.mark==n.mark==
    运算符中的code>不够,如果
    n
    m
    或两者都是
    null
    ?@DmitryBychenko:True,仅按原始实现执行。会修好的。是的,但为什么我们需要两个都过载!=和==一样,或者反之亦然,当你重载(a!=b)时,它会给你一个结果,这就是为什么我们需要检查(a==b),它不会产生任何错误Sense@vivek:你需要让它们都超负荷,因为只让一个超负荷会让人很困惑。我恐怕无法理解您的评论“查看当您重载(a!=b)时,它将给您结果,这就是为什么我们需要检查(a==b)”。如果您问为什么编译器不会自动提供其他重载,那么在某些情况下是可能的,但在其他情况下则不可能。(例如,可以重载这些运算符,使其不返回
    bool
    。)是的,但为什么我们需要同时重载这两个运算符!=和==一样,或者反之亦然,当你重载(a!=b)时,它会给你一个结果,这就是为什么我们需要检查(a==b),它没有任何意义
    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);
    }
    
      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);
        }
      }