| 속성 | 값 |
|---|---|
| 규칙 ID | CA1033 |
| 제목 | 인터페이스 메서드는 하위 유형에서 호출 가능해야 합니다. |
| 범주 | 디자인 |
| 수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 | 주요 변경 아님 |
| .NET 10에서 기본적으로 사용하도록 설정 | 아니요 |
| 적용 가능한 언어 | C# 및 Visual Basic |
원인
unsealed 형식 중 외부에서 볼 수 있는 형식은 public 인터페이스의 메서드를 명시적으로 구현하며, 동일한 이름을 가진 외부에서 볼 수 있는 대체 메서드를 제공하지 않습니다.
규칙 설명
public 인터페이스 메서드를 명시적으로 구현하는 기본 형식을 고려하세요. 기본 형식에서 파생되는 형식은 인터페이스로 캐스팅된 현재 인스턴스(C#에서 this)에 대한 참조를 통해서만 상속된 인터페이스 메서드에 액세스할 수 있습니다. 파생 형식이 상속된 인터페이스 메서드를 다시 명시적으로 구현하는 경우에는 기본 구현에 더 이상 액세스할 수 없습니다. 현재 인스턴스 참조를 통해 호출하면 파생된 구현이 호출됩니다. 이로 인해 재귀가 발생하고 결과적으로 스택 오버플로가 발생합니다.
이 규칙은 외부에 표시되는 System.IDisposable.Dispose 또는 Close() 메서드가 제공될 때 System.IDisposable.Dispose(Boolean)의 명시적 구현에 대한 위반을 보고하지 않습니다.
위반 문제를 해결하는 방법
이 규칙 위반 문제를 해결하려면 동일한 기능을 노출하고 파생 형식에 표시되거나 비명시적 구현으로 변경되는 새 메서드를 구현합니다. 호환성이 손상되는 변경이 허용되는 경우, 대안으로 타입을 'sealed'로 지정할 수 있습니다.
경고를 표시하지 않는 경우
명시적으로 구현된 메서드와 동일한 기능을 포함하지만 이름이 다르고 외부에 표시되는 메서드가 제공되는 경우에는 이 규칙의 경고를 표시하지 않아도 됩니다.
경고 표시 안 함
단일 위반을 억제하려면 원본 파일에 전처리기 지시문을 추가하여 규칙을 비활성화한 후 다시 활성화하십시오.
#pragma warning disable CA1033
// The code that's violating the rule is on this line.
#pragma warning restore CA1033
파일, 폴더 또는 프로젝트에 대한 규칙을 사용하지 않으려면 구성 파일에서 none의 심각도를 설정합니다.
[*.{cs,vb}]
dotnet_diagnostic.CA1033.severity = none
자세한 내용은 방법: 코드 분석 경고 표시 안 함을 참조하세요.
예시
다음 예제에서는 규칙을 위반하는 형식인 ViolatingBase 및 위반에 대한 수정을 보여 주는 형식인 FixedBase를 보여 줍니다.
public interface ITest
{
void SomeMethod();
}
public class ViolatingBase : ITest
{
void ITest.SomeMethod()
{
// ...
}
}
public class FixedBase : ITest
{
void ITest.SomeMethod()
{
SomeMethod();
}
protected void SomeMethod()
{
// ...
}
}
sealed public class Derived : FixedBase, ITest
{
public void SomeMethod()
{
// The following would cause recursion and a stack overflow.
// ((ITest)this).SomeMethod();
// The following is unavailable if derived from ViolatingBase.
base.SomeMethod();
}
}
참고하기
.NET