다음을 통해 공유


인터페이스를 구현하는 멤버와 관련된 오류 및 경고 해결

이 문서에서는 다음 컴파일러 오류를 다룹니다.

  • CS0071: 이벤트의 명시적 인터페이스 구현은 이벤트 접근자 구문을 사용해야 합니다.
  • CS0106: 한정자가 이 항목에 유효하지 않습니다.
  • CS0277: 멤버가 public이 아니어서 인터페이스 멤버를 구현하지 않습니다.
  • CS0425: 메서드의 형식 매개 변수에 대한 제약 조건은 인터페이스 메서드의 형식 매개 변수에 대한 제약 조건과 일치해야 합니다. 대신 명시적 인터페이스 구현을 사용하는 것이 좋습니다.
  • CS0460: 재정의 및 명시적 인터페이스 구현 메서드에 대한 제약 조건은 기본 메서드에서 상속되므로 'class' 또는 'struct' 제약 조건을 제외하고 직접 지정할 수 없습니다.
  • CS0470: 메서드는 형식에 대한 인터페이스 접근자를 구현할 수 없습니다. 명시적 인터페이스 구현을 사용합니다.
  • CS0473: 명시적 인터페이스 구현 '메서드 이름'이 둘 이상의 인터페이스 멤버와 일치합니다. 실제로 선택된 인터페이스 멤버는 구현에 따라 다릅니다. 대신 비 명시적 구현을 사용하는 것이 좋습니다.
  • CS0531: 인터페이스 멤버는 정의를 가질 수 없습니다.
  • CS0535: 멤버는 인터페이스 멤버를 구현하지 않습니다.
  • CS0538: 명시적 인터페이스 선언의 멤버는 인터페이스가 아닙니다.
  • CS0539: 구현할 수 있는 인터페이스의 멤버 중 명시적 인터페이스 선언의 멤버를 찾을 수 없습니다.
  • CS0540: 형식을 포함하는 것은 인터페이스 멤버를 구현하지 않습니다.
  • CS0541: 명시적 인터페이스 선언은 클래스, 레코드, 구조체 또는 인터페이스에서만 선언할 수 있습니다.
  • CS0550: 멤버가 인터페이스 멤버에 없는 접근자를 추가합니다.
  • CS0551: 명시적 인터페이스 구현에서 접근자가 누락되었습니다.
  • CS0630: 멤버는 __arglist 매개 변수가 있으므로 인터페이스 멤버를 구현할 수 없습니다.
  • CS0686: 접근자가 인터페이스 멤버를 구현할 수 없습니다. 명시적 인터페이스 구현을 사용합니다.
  • CS0736: 멤버가 인스턴스 인터페이스 멤버를 구현하지 않습니다. 정적이므로 인터페이스 멤버를 구현할 수 없습니다.
  • CS0737: 멤버가 인터페이스 멤버를 구현하지 않습니다. 공용이 아니므로 인터페이스 멤버를 구현할 수 없습니다.
  • CS0738: 멤버는 인터페이스 멤버를 구현하지 않습니다. 일치하는 반환 형식이 없으므로 사용할 수 없습니다.
  • CS8705: 인터페이스 멤버에는 가장 구체적인 구현이 없습니다. 두 멤버 모두 가장 구체적이지는 않습니다.
  • CS8854: 멤버가 인터페이스 멤버를 구현하지 않습니다.
  • CS9333: 매개 변수 형식은 구현된 멤버와 일치해야 합니다.
  • CS9334: 반환 형식은 구현된 멤버와 일치해야 합니다.

인터페이스 선언 및 구문

다음 오류는 명시적 인터페이스 구현을 선언할 때 적절한 구문 및 구조와 관련이 있습니다.

  • CS0071: 이벤트의 명시적 인터페이스 구현은 이벤트 접근자 구문을 사용해야 합니다.
  • CS0106: 한정자가 이 항목에 유효하지 않습니다.
  • CS0531: 인터페이스 멤버는 정의를 가질 수 없습니다.
  • CS0538: 명시적 인터페이스 선언의 멤버는 인터페이스가 아닙니다.
  • CS0541: 명시적 인터페이스 선언은 클래스, 레코드, 구조체 또는 인터페이스에서만 선언할 수 있습니다.

다음 기술을 사용하여 이러한 오류를 수정할 수 있습니다.

  • 명시적으로 인터페이스 이벤트(CS0071)를 구현할 때, addremove 이벤트 접근자를 수동으로 제공해야 합니다. 컴파일러는 명시적 인터페이스 구현을 위해 이러한 접근자를 자동으로 생성하지 않으므로 이벤트를 저장하고 관리하는 방법을 지정하기 위해 명시적으로 정의해야 합니다.
  • public 명시적 인터페이스 구현에서 한정자를 제거합니다(CS0106). 명시적 인터페이스 구현은 인터페이스 형식으로 액세스할 때 암시적으로 퍼블릭이 되므로, 이 맥락에서는 public 키워드가 불필요하며 허용되지 않습니다.
  • abstract 명시적 인터페이스 구현에서 한정자를 제거합니다(CS0106). 명시적 인터페이스 구현은 실제 구현을 제공하며 파생 클래스에서 재정의할 수 없으므로 추상으로 표시할 수 없습니다.
  • 인터페이스 멤버 선언에서 메서드 본문을 제거하거나 인터페이스를 구현하는 클래스 또는 구조체(CS0531)로 구현을 이동합니다. C# 8.0 이전에는 인터페이스 멤버가 구현을 포함할 수 없습니다. C# 8.0부터 특정 구문을 사용하여 기본 인터페이스 메서드 를 제공할 수 있습니다.
  • 명시적 인터페이스 선언에 지정된 형식이 실제 인터페이스 형식(CS0538)인지 확인합니다. 인터페이스 형식만 명시적 인터페이스 구현 구문에 사용할 수 있습니다. 클래스 또는 기타 비 인터페이스 형식을 사용하려고 시도하면 명시적 구현 규칙이 위반됩니다.
  • 기본 목록(CS0541)에서 인터페이스를 선언하는 클래스 또는 구조체로 명시적 인터페이스 선언을 이동합니다. 명시적 인터페이스 구현은 클래스 또는 구조체 형식의 본문 내에 나타나야 하며 네임스페이스 수준 또는 다른 컨텍스트에서 선언할 수 없습니다.

자세한 내용은 인터페이스, 명시적 인터페이스 구현인터페이스 이벤트를 구현하는 방법을 참조하세요.

반환 형식 및 서명

구현 메서드의 서명이 인터페이스 멤버 선언과 일치하지 않는 경우 다음 오류가 발생합니다.

  • CS0738: 멤버는 인터페이스 멤버를 구현하지 않습니다. 일치하는 반환 형식이 없으므로 사용할 수 없습니다.
  • CS8854: 멤버가 인터페이스 멤버를 구현하지 않습니다.
  • CS9333: 매개 변수 형식은 구현된 멤버와 일치해야 합니다.
  • CS9334: 반환 형식은 구현된 멤버와 일치해야 합니다.

다음 기술을 사용하여 이러한 오류를 수정할 수 있습니다.

  • 인터페이스 멤버(CS0738, CS9334)에 선언된 반환 형식과 정확히 일치하도록 구현 메서드의 반환 형식을 변경합니다. 메서드 서명이 구현되는 인터페이스 멤버를 결정하는 계약의 일부이기 때문에 구현의 서명은 인터페이스 선언과 정확하게 일치해야 합니다.
  • 구현 메서드의 매개 변수 형식이 인터페이스 멤버(CS9333)에 선언된 매개 변수 형식과 정확히 일치하는지 확인합니다. 매개 변수 형식은 컴파일러가 구현을 인터페이스 멤버와 일치시키는 데 사용하는 메서드 서명의 기본 구성 요소이므로 각 매개 변수는 인터페이스 선언에 지정된 것과 동일한 위치에 동일한 형식이어야 합니다.
  • 인터페이스 속성이 init setter(CS8854)를 선언할 때 구현 속성에 init 접근자를 추가합니다. 키워드를 init 사용하면 개체 생성 중에 속성을 초기화할 수 있지만 나중에 수정할 수 없도록 하며 구현 속성은 인터페이스 계약을 충족하는 동일한 초기화 전용 동작을 제공해야 합니다.

자세한 내용은 인터페이스, 속성초기화 전용 setter를 참조하세요.

누락되거나 불완전한 구현

클래스가 인터페이스를 완전히 구현하지 못하거나 인터페이스 계약과 일치하지 않는 멤버를 구현하는 경우 다음 오류가 발생합니다.

  • CS0535: 멤버는 인터페이스 멤버를 구현하지 않습니다.
  • CS0550: 멤버는 인터페이스 멤버에서 찾을 수 없는 접근자를 추가합니다.
  • CS0551: 명시적 인터페이스 구현에 접근자가 누락되었습니다.

다음 기술을 사용하여 이러한 오류를 수정할 수 있습니다.

  • 인터페이스에 선언된 모든 멤버에 대한 구현을 제공하거나 형식을 (abstract)로 선언합니다. 인터페이스 요구 사항을 충족하려면 각 멤버를 구현해야 합니다.
  • 인터페이스 속성(CS0550)에 선언되지 않은 구현 속성에서 접근자를 제거합니다. 구현 속성은 인터페이스 정의에 명시적으로 선언된 접근자만 포함할 수 있으므로 구현에서 인터페이스 계약이 지정한 것 이상의 기능을 추가하지 않습니다.
  • 인터페이스 선언과 일치하도록 명시적 인터페이스 구현에 필요한 모든 접근자를 추가합니다(CS0551). 인터페이스에 선언된 각 접근자는 구현에서 일치하는 서명이 있는 해당 접근자가 있어야 합니다. 구현이 인터페이스에서 정의한 완전한 접근자 계약을 충족해야 하기 때문에.

자세한 내용은 인터페이스 및속성을 참조하세요.

멤버 매칭 및 해결

인터페이스에 없는 인터페이스 멤버를 구현하려고 시도하거나 포함하는 형식이 인터페이스를 선언하지 않을 때 다음 오류가 발생합니다.

  • CS0539: 구현할 수 있는 인터페이스의 멤버 중 명시적 인터페이스 선언의 멤버를 찾을 수 없습니다.
  • CS0540: 형식을 포함하는 것은 인터페이스 멤버를 구현하지 않습니다.

다음 기술을 사용하여 이러한 오류를 수정할 수 있습니다.

  • 명시적 인터페이스 구현의 멤버 이름과 서명이 인터페이스에 선언된 멤버와 정확히 일치하는지 확인하거나 잘못된 구현(CS0539)을 제거합니다. 명시적 인터페이스 구현에는 인터페이스 계약과의 정확한 대응이 필요하기 때문에 구현하려는 멤버가 이름, 반환 형식 및 매개 변수 형식과 일치하는 인터페이스 정의에 실제로 있어야 합니다.
  • 클래스 또는 구조체의 기본 목록에 인터페이스를 추가하거나 명시적 인터페이스 구현(CS0540)을 제거합니다. 형식은 상속 목록에서 선언하는 인터페이스의 멤버만 명시적으로 구현할 수 있으므로 구현 형식은 명시적 구현을 제공하기 전에 인터페이스 관계를 설정해야 합니다.

자세한 내용은 인터페이스 및 명시적 인터페이스 구현 참조하세요.

제네릭 형식 제약 조건

형식 매개 변수 제약 조건이 있는 제네릭 인터페이스 메서드를 구현할 때 다음 오류가 발생합니다.

  • CS0425: 메서드의 형식 매개 변수에 대한 제약 조건은 인터페이스 메서드의 형식 매개 변수에 대한 제약 조건과 일치해야 합니다. 대신 명시적 인터페이스 구현을 사용하는 것이 좋습니다.
  • CS0460: 재정의 및 명시적 인터페이스 구현 메서드에 대한 제약 조건은 기본 메서드에서 상속되므로 'class' 또는 'struct' 제약 조건을 제외하고 직접 지정할 수 없습니다.

다음 기술을 사용하여 이러한 오류를 수정할 수 있습니다.

  • 구현 메서드의 where 절이 인터페이스 메서드 선언과 동일하거나 제약 조건의 의미 체계 의미와 일치하는지 확인합니다(CS0425). 구현의 형식 매개 변수 제약 조건은 인터페이스 또는 기본 메서드에 정의된 제약 조건과 일치해야 합니다.
  • 재정의 및 명시적 인터페이스 구현 메서드(CS0460)에서 명시적 제약 조건 선언을 제거합니다. 재정의 메서드는 기본 또는 인터페이스 메서드에서 해당 제약 조건을 자동으로 상속하므로 다시 선언하는 것은 중복되며 C# 8 이상에서 허용되는 특정 사례를 제외하고는 허용되지 않습니다.
  • default C# 9 이상(CS0460)을 사용할 때 재정의 및 명시적 인터페이스 구현에서 nullable 참조 형식의 모호성을 해결하려면 제약 조건을 적용합니다. 제약 조건 상속 규칙에 대한 이 예외를 사용하면 nullable 주석 컨텍스트를 명확하게 하기 위해 기본 제약 조건을 명시적으로 지정할 수 있습니다.
  • C# 8 이상을 사용하여 nullable 참조 형식 주석(where T : class)을 사용하도록 설정할 때 재정의 및 명시적 인터페이스 구현 메서드에 대해 명시적으로 지정하거나 where T : struct 제약 조건을 지정 합니다. 이러한 특정 제약 조건은 참조 또는 값 형식으로 제한되는 형식 매개 변수에 대해 nullable 참조 형식 분석을 지원할 수 있습니다.

자세한 내용은 형식 매개 변수, 인터페이스Nullable 참조 형식에 대한 제약 조건을 참조하세요.

메서드 표시 유형 및 한정자

잘못된 접근성 또는 한정자를 사용하여 인터페이스 메서드를 구현할 때 다음 오류가 발생합니다.

  • CS0736: 멤버가 인스턴스 인터페이스 멤버를 구현하지 않습니다. 정적이므로 인터페이스 멤버를 구현할 수 없습니다.
  • CS0737: 멤버가 인터페이스 멤버를 구현하지 않습니다. 공용이 아니므로 인터페이스 멤버를 구현할 수 없습니다.

다음 기술을 사용하여 이러한 오류를 수정할 수 있습니다.

  • 인터페이스 멤버를 static 구현하는 메서드 선언에서 한정자를 제거합니다(CS0736). C# 10 이전에는 인터페이스 멤버가 정적 멤버가 아닌 인스턴스 멤버입니다.
  • 인터페이스 멤버(publicCS0737)를 구현하는 메서드에 액세스 한정자를 추가합니다. 인터페이스가 공용 동작에 대한 계약을 정의하기 때문에 모든 인터페이스 멤버는 암시적으로 public 사용되므로 구현 메서드는 인터페이스 참조를 통해 액세스할 수 있는 공용 액세스 가능성도 있어야 합니다.

자세한 내용은 인터페이스 및액세스 한정자를 참조하세요.

접근자 구현 및 충돌

다음 오류는 표시 유형 문제가 있거나 명명 충돌이 있는 접근자 메서드를 사용하여 인터페이스 속성 또는 이벤트를 구현할 때 발생합니다.

  • CS0277: 멤버는 공용이 아니므로 인터페이스 멤버를 구현하지 않습니다.
  • CS0470: 메서드는 형식에 대한 인터페이스 접근자를 구현할 수 없습니다. 명시적 인터페이스 구현을 사용합니다.
  • CS0686: 접근자가 인터페이스 멤버를 구현할 수 없습니다. 명시적 인터페이스 구현을 사용합니다.

다음 기술을 사용하여 이러한 오류를 수정할 수 있습니다.

  • public보다 가시성이 낮게 제한되는 속성 접근자에서 액세스 한정자를 제거하거나 누락된 경우 public 한정자를 추가합니다(CS0277). 모든 인터페이스 멤버는 암시적으로 public사용되므로 구현 접근자는 인터페이스 계약을 충족하고 인터페이스 형식을 통해 액세스할 수 있도록 공용 액세스 가능성도 있어야 합니다.
  • 명시적 인터페이스 구현(get_PropertyName)을 사용하여 메서드를 접근자 같은 이름(예: )으로 적절한 속성 구문으로 대체합니다. 컴파일러는 속성에 대한 접근자 메서드를 내부적으로 생성하고 이러한 예약된 이름을 사용하여 메서드를 수동으로 만들려고 시도하면 속성 구현 메커니즘과 충돌합니다.
  • 인터페이스에 자동 생성된 접근자 메서드(CS0686)와 일치하는 메서드 이름이 포함된 경우 명시적 인터페이스 구현 구문을 사용하여 명명 충돌을 해결합니다. 컴파일러는 속성 및 get_Propertyset_Propertyadd_Event 이벤트에 대한 메서드 remove_Event 를 자동으로 생성하므로 인터페이스가 이러한 정확한 이름으로 메서드를 선언하는 경우 인터페이스 메서드와 컴파일러에서 생성된 접근자 간에 명확하게 구분하기 위해 명시적 구현이 필요합니다.

자세한 내용은 인터페이스, 속성이벤트를 참조하세요.

모호하고 충돌하는 구현

컴파일러에서 사용할 인터페이스 구현을 확인할 수 없는 경우 다음 오류가 발생합니다.

  • CS0473: 명시적 인터페이스 구현 '메서드 이름'이 둘 이상의 인터페이스 멤버와 일치합니다. 실제로 선택된 인터페이스 멤버는 구현에 따라 다릅니다. 대신 비 명시적 구현을 사용하는 것이 좋습니다.
  • CS8705: 인터페이스 멤버 'member'에는 가장 구체적인 구현이 없습니다. 어느 쪽도 가장 구체적이지 않습니다.

다음 기술을 사용하여 이러한 오류를 수정할 수 있습니다.

  • 명시적 인터페이스 구현을 제거하고 대신 두 인터페이스 메서드(CS0473)에 단일 암시적 공용 구현을 사용합니다. 제네릭 메서드가 제네릭이 아닌 메서드와 ITest<int> 동일한 서명을 획득하는 경우(예: 둘 다 TestMethod(int) 동일한 위치를 구현하는 TestMethod(T) 경우) 공용 언어 인프라 메타데이터 시스템은 어떤 인터페이스 멤버가 어떤 구현 슬롯에 바인딩되는지 명확하게 결정할 수 없으므로 암시적 구현을 사용하면 단일 메서드가 두 인터페이스 요구 사항을 모두 충족할 수 있습니다.
  • 구현 클래스 또는 구조체에서 여러 기본 구현 간의 모호성을 해결하는 명시적 구현을 제공합니다(CS8705). 이 오류는 일반적으로 클래스가 각각 동일한 멤버에 대한 기본 구현을 제공하는 여러 인터페이스를 구현하는 다이아몬드 상속 패턴에서 발생합니다. 컴파일러는 사용할 구현을 명시적으로 지정하거나 고유한 구현을 제공해야 합니다.
  • 여러 인터페이스가 동일한 멤버에 대한 기본 구현을 제공하는 다이아몬드 상속 충돌을 방지하도록 인터페이스 계층 구조를 재구성합니다(CS8705). 인터페이스 관계를 다시 디자인하거나 기본 구현을 단일 인터페이스로 통합하면 컴파일러가 가장 구체적인 구현을 결정하지 못하게 하는 모호성을 제거할 수 있습니다.

자세한 내용은 인터페이스 및기본 인터페이스 메서드를 참조하세요.

특별 구현 제한 사항

인터페이스 구현과 호환되지 않는 특수 매개 변수 형식을 사용하는 경우 다음 오류가 발생합니다.

  • CS0630: 멤버는 __arglist 매개 변수가 있으므로 인터페이스 멤버를 구현할 수 없습니다.

다음 기술을 사용하여 이 오류를 수정할 수 있습니다.

  • __arglist 구현 메서드(CS0630)에서 매개 변수를 제거합니다. 키 __arglist 워드를 사용하면 메서드가 관리되지 않는 방식으로 가변 개수의 인수를 수락할 수 있지만 인터페이스 계약에는 컴파일 시간에 확인할 수 있는 예측 가능하고 형식이 안전한 서명이 필요하기 때문에 인터페이스 구현과 호환되지 않습니다.
  • 매개 변수를 __arglistparams 가변 길이 인수 목록(CS0630)의 배열 매개 변수로 바꿉니다. 이와 달리 __arglistparams 워드는 인터페이스 구현과 완전히 호환되고 인터페이스에 필요한 컴파일 시간 형식 안전성을 유지하는 가변 수의 인수를 수락하기 위한 형식 안전 메커니즘을 제공합니다.

자세한 내용은 Interfacesparams 키워드를 참조하세요.