다음을 통해 공유


CA1033: 인터페이스 메서드는 자식 형식에서 호출할 수 있어야 합니다.

속성
규칙 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();
    }
}

참고하기