다음을 통해 공유


CA1013: 더하기 및 빼기를 오버로드할 때 같음 연산자를 오버로드하십시오.

TypeName

OverloadOperatorEqualsOnOverloadingAddAndSubtract

CheckId

CA1013

범주

Microsoft.Design

변경 수준

주요 변경 아님

원인

public 또는 protected 형식이 같음 연산자를 구현하지 않고 더하기 또는 빼기 연산자를 구현합니다.

규칙 설명

더하기 및 빼기 등과 같은 연산을 사용하여 형식의 인스턴스를 조합할 때는 구성 값이 같은 두 인스턴스에 대해 true가 반환되도록 거의 대부분의 경우 같음 연산을 정의해야 합니다.

같음 연산자의 오버로드된 구현에서는 기본 같음 연산자를 사용할 수 없습니다.기본 같음 연산자를 사용하면 스택 오버플로가 발생합니다.같음 연산자를 구현하려면 구현에 Object.Equals 메서드를 사용합니다.다음 예제를 참조하십시오.

If (Object.ReferenceEquals(left, Nothing)) Then
    Return Object.ReferenceEquals(right, Nothing)
Else
    Return left.Equals(right)
End If
if (Object.ReferenceEquals(left, null)) 
    return Object.ReferenceEquals(right, null);
return left.Equals(right);

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 더하기 및 빼기 연산자와 수학적으로 일관되도록 같음 연산자를 구현합니다.

경고를 표시하지 않는 경우

같음 연산자의 기본 구현이 형식에 대해 올바른 동작을 제공하는 경우에는 이 규칙에서 경고를 표시하지 않아도 안전합니다.

예제

다음 예제에서는 이 규칙을 위반하는 형식(BadAddableType)을 정의합니다.이 형식은 필드 값이 같은 모든 두 인스턴스의 같음 테스트가 true가 되도록 같음 연산자를 구현해야 합니다.GoodAddableType 형식은 수정된 구현을 보여 줍니다.이 형식은 다른 규칙을 충족하기 위해 같지 않음 연산자도 구현하고 Equals를 재정의합니다.완전한 구현은 GetHashCode도 구현합니다.

using System;

namespace DesignLibrary
{
   public class BadAddableType
   {
      private int a, b;
      public BadAddableType(int a, int b)
      {
         this.a = a;
         this.b = b;
      }
      // Violates rule: OverrideOperatorEqualsOnOverridingAddAndSubtract.
      public static BadAddableType operator +(BadAddableType a, BadAddableType b)
      {
         return new BadAddableType(a.a + b.a, a.b + b.b);
      }
      // Violates rule: OverrideOperatorEqualsOnOverridingAddAndSubtract.
      public static BadAddableType operator -(BadAddableType a, BadAddableType b)
      {
         return new BadAddableType(a.a - b.a, a.b - b.b);
      }
      public override string ToString()
      {
         return String.Format("{{{0},{1}}}", a, b);
      }
   }

   public class GoodAddableType
   {
      private int a, b;
      public GoodAddableType(int a, int b)
      {
         this.a = a;
         this.b = b;
      }
      // Satisfies rule: OverrideOperatorEqualsOnOverridingAddAndSubtract.
      public static bool operator ==(GoodAddableType a, GoodAddableType b)
      {
         return (a.a == b.a && a.b == b.b);
      }

      // If you implement ==, you must implement !=.
      public static bool operator !=(GoodAddableType a, GoodAddableType b)
      {
         return !(a==b);
      }

      // Equals should be consistent with operator ==.
      public override bool Equals(Object obj)
      {
         GoodAddableType good = obj as GoodAddableType;
         if (obj == null)
            return false;

        return this == good;
      }

      public static GoodAddableType operator +(GoodAddableType a, GoodAddableType b)
      {
         return new GoodAddableType(a.a + b.a, a.b + b.b);
      }

      public static GoodAddableType operator -(GoodAddableType a, GoodAddableType b)
      {
         return new GoodAddableType(a.a - b.a, a.b - b.b);
      }
      public override string ToString()
      {
         return String.Format("{{{0},{1}}}", a, b);
      }
   }
}

다음 예제에서는 이 항목의 앞에서 정의된 형식의 인스턴스로 같음을 테스트하여 같음 연산자에 대한 기본 동작과 올바른 동작을 보여 줍니다.

using System;

namespace DesignLibrary
{
    public class TestAddableTypes
    {
       public static void Main()
       {
          BadAddableType a = new BadAddableType(2,2);
          BadAddableType b = new BadAddableType(2,2);
          BadAddableType x = new BadAddableType(9,9);
          GoodAddableType c = new GoodAddableType(3,3);
          GoodAddableType d = new GoodAddableType(3,3);
          GoodAddableType y = new GoodAddableType(9,9);

          Console.WriteLine("Bad type:  {0} {1} are equal? {2}", a,b, a.Equals(b)? "Yes":"No");
          Console.WriteLine("Good type: {0} {1} are equal? {2}", c,d, c.Equals(d)? "Yes":"No");
          Console.WriteLine("Good type: {0} {1} are == ?   {2}", c,d, c==d? "Yes":"No");
          Console.WriteLine("Bad type:  {0} {1} are equal? {2}", a,x, a.Equals(x)? "Yes":"No");
          Console.WriteLine("Good type: {0} {1} are == ?   {2}", c,y, c==y? "Yes":"No");
       }
    }
}

이 예제의 결과는 다음과 같습니다.

  
  
  
  
  
  

참고 항목

참조

Guidelines for Implementing Equals and the Equality Operator (==)