다음을 통해 공유


확장 멤버 선언에서 오류 및 경고 해결

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

  • CS1100: 메서드에 첫 번째 매개 변수에 없는 'this' 매개 변수 한정자가 있습니다.
  • CS1101: 매개 변수 한정자 ''는 'ref'this와 함께 사용할 수 없습니다.
  • CS1102: 매개 변수 한정자 ''는 'out'this와 함께 사용할 수 없습니다.
  • CS1103: 확장 메서드의 첫 번째 매개 변수는 포인터 형식일 수 없습니다.
  • CS1105: 확장 메서드는 정적이어야 합니다.
  • CS1106: 확장 메서드는 제네릭이 아닌 정적 클래스에서 정의해야 합니다.
  • CS1109: 확장 메서드는 최상위 정적 클래스에 정의되어야 합니다. 'name'은 중첩 클래스입니다.
  • CS1110: 컴파일러 필수 형식 ExtensionAttribute 을 찾을 수 없으므로 새 확장을 정의할 수 없습니다. System.Core.dll대한 참조가 누락되었나요?
  • CS1112: ''ExtensionAttribute을 사용하지 마세요. 대신 'this' 키워드를 사용합니다.
  • CS1113: 값 형식에 정의된 확장 메서드를 사용하여 대리자를 만들 수 없습니다.
  • CS1743: 'this' 매개 변수의 기본값을 지정할 수 없습니다.
  • CS9281: 확장 선언에 이름이 없을 수 있습니다.
  • CS9282: 확장 선언에는 메서드 또는 속성만 포함될 수 있습니다.
  • CS9283: 확장은 제네릭이 아닌 최상위 정적 클래스에서 선언해야 합니다.
  • CS9284: 확장의 수신기 매개 변수는 기본값을 가질 수 없습니다.
  • CS9285: 확장 컨테이너에는 수신기 매개 변수가 하나만 있을 수 있습니다.
  • CS9287: 수신기 매개 변수는 확장 컨테이너 형식 매개 변수와 같은 이름을 가질 수 없습니다.
  • CS9288: 매개 변수, 지역 변수 또는 로컬 함수는 확장 컨테이너 형식 매개 변수와 같은 이름을 가질 수 없습니다.
  • CS9289: 멤버 형식 매개 변수의 이름은 확장 컨테이너 형식 매개 변수와 같습니다.
  • CS9290: 매개 변수, 지역 변수 또는 로컬 함수는 확장 매개 변수와 같은 이름을 가질 수 없습니다.
  • CS9291: ''value: 자동으로 생성된 매개 변수 이름이 확장 매개 변수 이름과 충돌합니다.
  • CS9292: 형식 매개 변수의 이름은 확장 매개 변수와 같습니다.
  • CS9293: 이 컨텍스트에서 확장 매개 변수를 사용할 수 없습니다.
  • CS9294: ''value: 자동으로 생성된 매개 변수 이름이 확장 형식 매개 변수 이름과 충돌합니다.
  • CS9295: 확장 형식은 확장에서 선언한 모든 형식 매개 변수를 참조해야 하지만 형식 매개 변수는 참조되지 않습니다.
  • CS9300: 확장 블록의 'ref' 수신기 매개 변수는 구조체로 제한되는 값 형식 또는 제네릭 형식이어야 합니다.
  • CS9301: 확장의 'in' 또는 'ref readonly' 수신기 매개 변수는 구체적인(제네릭이 아닌) 값 형식이어야 합니다.
  • CS9302: 확장 블록에 선언된 새 보호된 멤버입니다.
  • CS9303: 명명되지 않은 수신기 매개 변수를 사용하여 확장 블록에서 인스턴스 멤버를 선언할 수 없습니다.
  • CS9304: 확장 블록에서 init 전용 접근자를 선언할 수 없습니다.
  • CS9305: 확장 블록의 명명되지 않은 수신기 매개 변수에서 한정자를 사용할 수 없습니다.
  • CS9306: 형식 및 별칭의 이름은 'extension'으로 지정할 수 없습니다.
  • CS9309: 확장 멤버 구문은 확장 멤버 구문 내의 중첩된 위치에서 허용되지 않습니다.
  • CS9316: 확장 멤버는 ''nameof에 대한 인수로 허용되지 않습니다.
  • CS9317: 단항 연산자의 매개 변수는 확장 형식이어야 합니다.
  • CS9318: ++ 또는 -- 연산자의 매개 변수 형식은 확장 형식이어야 합니다.
  • CS9319: 이진 연산자의 매개 변수 중 하나는 확장 형식이어야 합니다.
  • CS9320: 오버로드된 시프트 연산자의 첫 번째 피연산자는 확장된 형식과 동일한 형식이어야 합니다.
  • CS9321: 정적 클래스를 확장하는 확장 블록에는 사용자 정의 연산자를 포함할 수 없습니다.
  • CS9322: 확장 블록 수신기 매개 변수를 포함하는 것이 'ref' 매개 변수가 아니면 구조체에 대한 인스턴스 연산자를 선언할 수 없습니다.
  • CS9323: 구조체로 알려져 있지 않고 클래스로 알려져 있지 않은 형식에 대한 인스턴스 확장 연산자를 선언할 수 없습니다.
  • CS9326: 'name': 확장 멤버 이름은 확장 형식과 같을 수 없습니다.
  • CS9329: 이 확장 블록은 다른 확장 블록과 충돌합니다. 메타데이터에서 콘텐츠 기반 형식 이름이 충돌합니다.
  • CS9339: 확장 해결은 다음 멤버 간에 모호합니다.

확장 선언에 대한 일반적인 오류

  • CS1102: 매개 변수 한정자 ''는 'out'this와 함께 사용할 수 없습니다.
  • CS1103: 확장 메서드의 첫 번째 매개 변수는 포인터 형식일 수 없습니다.
  • CS1106: 확장 메서드는 제네릭이 아닌 정적 클래스에서 정의해야 합니다.
  • CS1109: 확장 메서드는 최상위 정적 클래스에 정의되어야 합니다. 'name'은 중첩 클래스입니다.
  • CS1113: 값 형식에 정의된 확장 메서드를 사용하여 대리자를 만들 수 없습니다.
  • CS1743: 'this' 매개 변수의 기본값을 지정할 수 없습니다.
  • CS9283: 확장은 제네릭이 아닌 최상위 정적 클래스에서 선언해야 합니다.
  • CS9284: 확장의 수신기 매개 변수는 기본값을 가질 수 없습니다.
  • CS9285: 확장 컨테이너에는 수신기 매개 변수가 하나만 있을 수 있습니다.

컴파일러는 선택한 구문에 관계없이 모든 확장 멤버 선언에 적용되는 규칙을 위반할 때 이러한 오류를 내보낸다. 자세한 내용은 Extension 메서드를 참조하세요.

확장 멤버를 올바르게 선언하려면 다음 요구 사항을 따릅니다.

  • 포함하는 형식을 제네릭 static 이 아닌 클래스 또는 구조체(CS1106, CS9283)로 선언합니다.
  • 다른 형식(CS1109, CS9283) 내에 중첩되지 않고 최상위 수준에서 포함하는 형식을 선언합니다.
  • 값 형식의 확장 메서드를 대리자(CS1113)로 변환하지 마세요. 대신 일반 메서드를 만듭니다.
  • 수신기 매개 변수(out)에서 매개 변수 한정자를 사용하지 마세요.
  • 수신기 매개 변수(CS1743, CS9284)에 대한 기본값을 제공하지 마세요.
  • 포인터 형식을 확장하지 마세요(CS1103). 한정자를 적용하는 this 매개 변수는 포인터 형식이 될 수 없습니다.
  • 확장 컨테이너당 하나의 수신기 매개 변수만 선언합니다(CS9285).
  • CS9281: 확장 선언에 이름이 없을 수 있습니다.
  • CS9282: 확장 선언에는 메서드 또는 속성만 포함될 수 있습니다.
  • CS9287: 수신기 매개 변수는 확장 컨테이너 형식 매개 변수와 같은 이름을 가질 수 없습니다.
  • CS9288: 매개 변수, 지역 변수 또는 로컬 함수는 확장 컨테이너 형식 매개 변수와 같은 이름을 가질 수 없습니다.
  • CS9289: 멤버 형식 매개 변수의 이름은 확장 컨테이너 형식 매개 변수와 같습니다.
  • CS9290: 매개 변수, 지역 변수 또는 로컬 함수는 확장 매개 변수와 같은 이름을 가질 수 없습니다.
  • CS9291: ''value: 자동으로 생성된 매개 변수 이름이 확장 매개 변수 이름과 충돌합니다.
  • CS9292: 형식 매개 변수의 이름은 확장 매개 변수와 같습니다.
  • CS9293: 이 컨텍스트에서 확장 매개 변수를 사용할 수 없습니다.
  • CS9294: ''value: 자동으로 생성된 매개 변수 이름이 확장 형식 매개 변수 이름과 충돌합니다.
  • CS9295: 확장 형식은 확장에서 선언한 모든 형식 매개 변수를 참조해야 하지만 형식 매개 변수는 참조되지 않습니다.
  • CS9300: 확장 블록의 'ref' 수신기 매개 변수는 구조체로 제한되는 값 형식 또는 제네릭 형식이어야 합니다.
  • CS9301: 확장의 'in' 또는 'ref readonly' 수신기 매개 변수는 구체적인(제네릭이 아닌) 값 형식이어야 합니다.
  • CS9302: 확장 블록에 선언된 새 보호된 멤버입니다.
  • CS9303: 명명되지 않은 수신기 매개 변수를 사용하여 확장 블록에서 인스턴스 멤버를 선언할 수 없습니다.
  • CS9304: 확장 블록에서 init 전용 접근자를 선언할 수 없습니다.
  • CS9305: 확장 블록의 명명되지 않은 수신기 매개 변수에서 한정자를 사용할 수 없습니다.
  • CS9306: 형식 및 별칭의 이름은 'extension'으로 지정할 수 없습니다.
  • CS9309: 확장 멤버 구문은 확장 멤버 구문 내의 중첩된 위치에서 허용되지 않습니다.
  • CS9316: 확장 멤버는 ''nameof에 대한 인수로 허용되지 않습니다.
  • CS9317: 단항 연산자의 매개 변수는 확장 형식이어야 합니다.
  • CS9318: ++ 또는 -- 연산자의 매개 변수 형식은 확장 형식이어야 합니다.
  • CS9319: 이진 연산자의 매개 변수 중 하나는 확장 형식이어야 합니다.
  • CS9320: 오버로드된 시프트 연산자의 첫 번째 피연산자는 확장된 형식과 동일한 형식이어야 합니다.
  • CS9321: 정적 클래스를 확장하는 확장 블록에는 사용자 정의 연산자를 포함할 수 없습니다.
  • CS9322: 확장 블록 수신기 매개 변수를 포함하는 것이 'ref' 매개 변수가 아니면 구조체에 대한 인스턴스 연산자를 선언할 수 없습니다.
  • CS9323: 구조체로 알려져 있지 않고 클래스로 알려져 있지 않은 형식에 대한 인스턴스 확장 연산자를 선언할 수 없습니다.
  • CS9326: 'name': 확장 멤버 이름은 확장 형식과 같을 수 없습니다.
  • CS9329: 이 확장 블록은 다른 확장 블록과 충돌합니다. 메타데이터에서 콘텐츠 기반 형식 이름이 충돌합니다.
  • CS9339: 확장 해석이 다음 멤버들 사이에서 모호합니다.

이러한 오류는 확장 블록, C# 14 기능과 관련이 있습니다. 확장 블록은 정적 클래스에서 extension 컨텍스트 키워드를 사용하여 선언됩니다. 자세한 내용은 Extension 메서드를 참조하세요.

확장 블록을 올바르게 선언하려면 다음 요구 사항을 따릅니다.

  • 확장 선언에 이름 토큰을 포함하지 마세요(CS9281). 확장은 수신기만 정의합니다.
  • 수신기 매개 변수에 대한 기본값을 제공하지 마세요(CS9284, 일반적인 오류로 처리됨).
  • 형식 또는 별칭에 extension 키워드를 사용하지 마세요(CS9306). 확장 블록에 대해서만 컨텍스트 키워드입니다.

확장 블록에서 확장 멤버를 올바르게 선언하려면 일반적인 규칙 외에도 다음 요구 사항을 따릅니다.

  • 메서드 또는 속성만 확장 멤버로 포함합니다(CS9282). 다른 멤버 형식은 지원되지 않습니다.
  • 인스턴스 확장 멤버를 포함하도록 수신기의 매개 변수 이름을 제공합니다(CS9303).
  • 수신기 매개 변수 이름이 확장 블록 내에서 고유하고 형식 매개 변수(CS9287, CS9288, CS9289, CS9290, CS9291, CS9292, CS9294)와 충돌하지 않는지 확인합니다.
  • 확장 형식(CS9295)의 확장에 선언된 모든 형식 매개 변수를 참조합니다. 개별 멤버에 추가 형식 매개 변수를 추가할 수 있습니다.
  • 다른 확장 블록 내에 확장 블록을 중첩하지 마세요(CS9309).
  • ref 값 형식 또는 구조체로 제한되는 제네릭 형식(CS9300)에서만 수신기 매개 변수의 한정자를 사용합니다.
  • in 또는 ref readonly 수정자를 수신 매개 변수에서 사용할 때, 이는 구체적인(비제네릭) 값 형식에서만 가능합니다 (CS9301).
  • 이름 없는 수신기 매개 변수(CS9305)에서는 한정자를 사용하지 마세요.
  • 확장 블록에서 멤버를 선언 protected 하지 마세요(CS9302). 확장이 범위에 있는 경우 확장 멤버에 액세스할 수 있어야 합니다.
  • 확장 블록에서 init-only 접근자를 선언하지 마세요 (CS9304). 대신 일반적인 속성 setter를 사용합니다.
  • 확장 멤버를 연산자에 nameof 대한 인수로 사용하지 마세요(CS9316).
  • 확장 형식 이름과 다른 멤버 이름(CS9326)을 선택합니다.
  • 확장 블록에 메타데이터에 고유한 콘텐츠 기반 형식 이름이 있는지 확인합니다(CS9329). 충돌을 방지하기 위해 확장 블록을 통합하거나 구분합니다.
  • 보다 구체적인 형식 정보를 제공하거나 정규화된 이름(CS9339)을 사용하여 모호한 확장 멤버 호출을 해결합니다.

확장 블록 연산자 요구 사항

확장 블록은 특정 요구 사항이 있는 사용자 정의 연산자를 지원합니다.

  • 단항 연산자는 확장 형식을 해당 매개 변수로 사용해야 합니다(CS9317).
  • 증가(++) 및 감소(--) 연산자는 확장 형식을 해당 매개 변수(CS9318)로 포함해야 합니다.
  • 이진 연산자는 확장 형식(CS9319)인 매개 변수가 하나 이상 있어야 합니다.
  • Shift 연산자는 확장된 형식을 첫 번째 피연산자(CS9320)로 포함해야 합니다.
  • 정적 클래스를 확장하는 확장 블록에서 사용자 정의 연산자를 선언하지 마세요(CS9321).
  • 인스턴스 연산자를 사용하여 구조체를 확장하는 경우 수신기 매개 변수(ref)에서 한정자를 사용합니다.
  • 구조체 또는 클래스(CS9323)로 제한되지 않는 형식에 대한 인스턴스 연산자를 선언하지 마세요.
  • CS1100: 메서드에 첫 번째 매개 변수에 없는 'this' 매개 변수 한정자가 있습니다.
  • CS1101: 매개 변수 한정자 ''는 'ref'this와 함께 사용할 수 없습니다.
  • CS1105: 확장 메서드는 정적이어야 합니다.
  • CS1110: 컴파일러 필수 형식 ExtensionAttribute 을 찾을 수 없으므로 새 확장을 정의할 수 없습니다. System.Core.dll대한 참조가 누락되었나요?
  • CS1112: ''ExtensionAttribute을 사용하지 마세요. 대신 'this' 키워드를 사용합니다.

이러한 오류는 첫 번째 매개 변수에 한정자를 추가하여 수신기를 this 선언하는 확장 메서드와 관련이 있습니다. 자세한 내용은 Extension 메서드를 참조하세요.

매개 변수 확장 메서드를 올바르게 선언 this 하려면 일반적인 규칙 외에도 다음 요구 사항을 따릅니다.

  • 메서드에 static 한정자를 추가합니다(CS1105).
  • 첫 번째 this 매개 변수(CS1100)에만 매개 변수 한정자를 적용합니다.
  • ref 한정자와 this 한정자(CS1101)를 결합하지 마세요. ref를 사용하려면 확장 블록으로 변환하세요.
  • .NET Framework 앱(System.Core.dll)에 참조 를 추가합니다.
  • this 특성을 직접 적용하는 ExtensionAttribute 대신 첫 번째 매개 변수에서 한정자를 사용합니다(CS1112).