CA1046: 참조 형식에 같음 연산자를 오버로드하지 마십시오.

속성 값
규칙 ID CA1046
제목 참조 형식에 대한 연산자 equals를 오버로드하지 마세요.
범주 디자인
수정 사항이 패치를 중단시키는지 혹은 유지하는지 여부 주요 변경
.NET 10에서 기본적으로 사용하도록 설정 아니요
적용 가능한 언어 C# 및 Visual Basic

원인

public 참조 형식 또는 중첩된 public 형식이 동등 연산자를 오버로드합니다.

규칙 설명

참조 형식의 경우 같음 연산자의 기본 구현은 대부분 항상 올바릅니다. 기본적으로 두 참조는 같은 개체를 가리킬 경우에만 같습니다.

위반 문제를 해결하는 방법

해당 규칙 위반 문제를 해결하려면 같음 연산자의 구현을 제거합니다.

경고를 표시하지 않는 경우

참조 형식이 기본 제공 값 형식처럼 동작하는 경우 규칙에서 경고를 표시하지 않는 것이 안전합니다. 형식의 인스턴스에서 더하기 또는 빼기를 수행하는 것이 의미가 있는 경우 같음 연산자를 구현하고 위반을 표시하지 않는 것이 올바를 수 있습니다.

경고 표시 안 함

특정 위반을 억제하려면, 먼저 규칙을 비활성화하고 다시 활성화하기 위해 원본 파일에 전처리기 지시문을 추가하세요.

#pragma warning disable CA1046
// The code that's violating the rule is on this line.
#pragma warning restore CA1046

파일, 폴더 또는 프로젝트의 규칙을 비활성화하려면 none에서 심각도를 로 설정합니다.

[*.{cs,vb}]
dotnet_diagnostic.CA1046.severity = none

자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.

분석할 코드 구성

다음 옵션을 사용하여 이 규칙이 실행될 코드베이스 부분을 구성합니다.

이 규칙, 적용되는 모든 규칙 또는 적용되는 이 범주(디자인)의 모든 규칙에 대해 이 옵션을 구성할 수 있습니다. 자세한 내용은 코드 품질 규칙 구성 옵션을 참조하세요.

특정 API 화면 포함

api_surface 옵션을 설정하여 접근성에 따라 이 규칙을 실행할 코드베이스의 일부를 구성할 수 있습니다. 예를 들어 규칙이 퍼블릭이 아닌 API 표면에서만 실행되도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.

dotnet_code_quality.CAXXXX.api_surface = private, internal

메모

XXXX CAXXXX 부분을 해당 규칙의 ID로 바꿉니다.

예 1

다음 예제에서는 두 참조를 비교할 때의 기본 동작을 보여 줍니다.

public class MyReferenceType
{
    private int a, b;
    public MyReferenceType(int a, int b)
    {
        this.a = a;
        this.b = b;
    }

    public override string ToString()
    {
        return String.Format($"({a},{b})");
    }
}

예제 2

다음 적용 예제는 일부 참조를 비교합니다.

public class ReferenceTypeEquality
{
    public static void Main1046()
    {
        MyReferenceType a = new(2, 2);
        MyReferenceType b = new(2, 2);
        MyReferenceType c = a;

        Console.WriteLine($"a = new {a} and b = new {b} are equal? {(a.Equals(b) ? "Yes" : "No")}");
        Console.WriteLine($"c and a are equal? {(c.Equals(a) ? "Yes" : "No")}");
        Console.WriteLine($"b and a are == ? {(b == a ? "Yes" : "No")}");
        Console.WriteLine($"c and a are == ? {(c == a ? "Yes" : "No")}");
    }
}

이 예제는 다음과 같은 출력을 생성합니다.

a = new (2,2) and b = new (2,2) are equal? No
c and a are equal? Yes
b and a are == ? No
c and a are == ? Yes

참고 항목