다음을 통해 공유


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

속성
규칙 ID CA1033
제목 인터페이스 메서드는 자식 형식에서 호출할 수 있어야 합니다.
범주 디자인
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 9에서 기본적으로 사용 아니요

원인

외부에서 볼 수 있는 unsealed 형식이 public 인터페이스의 명시적 메서드 구현을 제공하면서 외부에서 볼 수 있는 같은 이름의 대체 메서드를 제공하지 않습니다.

규칙 설명

public 인터페이스 메서드를 명시적으로 구현하는 기본 형식을 고려하세요. 기본 형식에서 파생되는 형식은 인터페이스로 캐스팅된 현재 인스턴스(C#에서 this)에 대한 참조를 통해서만 상속된 인터페이스 메서드에 액세스할 수 있습니다. 파생 형식이 상속된 인터페이스 메서드를 다시 명시적으로 구현하는 경우에는 기본 구현에 더 이상 액세스할 수 없습니다. 현재 인스턴스 참조를 통해 호출하면 파생된 구현이 호출됩니다. 이로 인해 재귀가 발생하고 결과적으로 스택 오버플로가 발생합니다.

이 규칙은 외부에 표시되는 Close() 또는 System.IDisposable.Dispose(Boolean) 메서드가 제공될 때 System.IDisposable.Dispose의 명시적 구현에 대한 위반을 보고하지 않습니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 동일한 기능을 노출하고 파생 형식에 표시되거나 비명시적 구현으로 변경되는 새 메서드를 구현합니다. 호환성이 손상되는 변경이 허용되는 경우에는 형식을 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();
    }
}

참고 항목