CA1046: 참조 형식에 같음 연산자를 오버로드하지 마십시오.
속성 | 값 |
---|---|
규칙 ID | CA1046 |
제목 | 참조 형식에 같음 연산자를 오버로드하지 마세요. |
범주 | 디자인 |
수정 사항이 주요 변경인지 여부 | 주요 변경 |
.NET 9에서 기본적으로 사용 | 아니요 |
원인
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 표면에서만 실행되도록 지정하려면 프로젝트의 .editorconfig 파일에 다음 키-값 쌍을 추가합니다.
dotnet_code_quality.CAXXXX.api_surface = private, internal
예 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("({0},{1})", a, b);
}
}
예제 2
다음 적용 예제는 일부 참조를 비교합니다.
public class ReferenceTypeEquality
{
public static void Main1046()
{
MyReferenceType a = new MyReferenceType(2, 2);
MyReferenceType b = new MyReferenceType(2, 2);
MyReferenceType c = a;
Console.WriteLine("a = new {0} and b = new {1} are equal? {2}", a, b, a.Equals(b) ? "Yes" : "No");
Console.WriteLine("c and a are equal? {0}", c.Equals(a) ? "Yes" : "No");
Console.WriteLine("b and a are == ? {0}", b == a ? "Yes" : "No");
Console.WriteLine("c and a are == ? {0}", 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
참고 항목
.NET