다음을 통해 공유


코드에서 특성 선언 또는 특성 사용과 관련된 오류 및 경고 해결

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

  • CS0181: 특성 생성자 매개 변수에는 유효한 특성 매개 변수 형식이 아닌 형식이 있습니다.
  • CS0243: 조건부 특성은 재정의 메서드이므로 'method'에서 유효하지 않습니다.
  • CS0404: 이 선언 형식에서는 특성이 잘못되었습니다.
  • CS0415: 이 특성은 명시적 인터페이스 멤버 선언이 아닌 인덱서에서만 유효합니다.
  • CS0416: 'type 매개 변수': 특성 인수는 형식 매개 변수를 사용할 수 없습니다.
  • CS0447: 특성은 형식 인수와 함께 사용할 수 없습니다.
  • CS0577: 조건부 특성은 생성자, 소멸자, 연산자, 람다 식 또는 명시적 인터페이스 구현이므로 유효하지 않습니다.
  • CS0578: 반환 형식이 void가 아니므로 조건부 특성이 'function'에서 유효하지 않습니다.
  • CS0579: 중복 특성
  • CS0582: 조건부 특성이 인터페이스 멤버에서 유효하지 않습니다.
  • CS0592: 이 선언 형식에서는 특성이 잘못되었습니다. 특정 선언에서만 유효합니다.
  • CS0609: 재정의로 표시된 인덱서에서 특성을 설정할 수 없습니다.
  • CS0616: 형식이 특성 클래스가 아닙니다.
  • CS0625: StructLayout(LayoutKind.Explicit)으로 표시된 형식의 인스턴스 필드에는 FieldOffset 특성이 있어야 합니다.
  • CS0629: 조건부 멤버 'member'는 'Type Name' 형식의 인터페이스 멤버 '기본 클래스 멤버'를 구현할 수 없습니다.
  • CS0636: FieldOffset 특성은 StructLayout(LayoutKind.Explicit)으로 표시된 형식의 멤버에만 배치할 수 있습니다.
  • CS0637: FieldOffset 특성은 정적 또는 const 필드에서 허용되지 않습니다.
  • CS0641: 이 특성은 System.Attribute에서 파생된 클래스에서만 유효합니다.
  • CS0646: 인덱서가 포함된 형식에서 DefaultMember 특성을 지정할 수 없습니다.
  • CS0647: 특성을 내보내는 동안 오류가 발생했습니다.
  • CS0653: 'class' 특성 클래스는 추상이므로 적용할 수 없습니다.
  • CS0657: 위치가 이 선언에 유효한 특성 위치가 아닙니다. 이 선언에 대한 유효한 특성 위치가 나열됩니다. 이 블록의 모든 특성은 무시됩니다.
  • CS0658: 위치가 인식된 특성 위치가 아닙니다. 이 선언에 대한 유효한 특성 위치가 나열됩니다. 이 블록의 모든 특성은 무시됩니다.
  • CS0668: 두 인덱서의 이름은 서로 다릅니다. IndexerName 특성은 형식 내의 모든 인덱서에서 동일한 이름으로 사용해야 합니다.
  • CS0685: 조건부 멤버 'member'에는 out 매개 변수가 있을 수 없습니다.
  • CS0735: TypeForwardedTo 특성의 인수로 지정된 형식이 잘못되었습니다.
  • CS0739: Duplicate TypeForwardedToAttribute
  • CS1608: C# 형식에서는 RequiredAttribute 특성이 허용되지 않습니다.
  • CS1614: 특성 이름이 모호합니다. '@name'을 사용하거나 '특성' 접미사를 명시적으로 포함합니다.
  • CS1618: 메서드 또는 재정의된 메서드에 조건부 특성이 있어 대리자를 만들 수 없습니다.
  • CS1667: 특성은 속성 또는 이벤트 접근자에 유효하지 않습니다. 특정 선언에서만 사용 가능합니다.
  • CS1689: 특성은 메서드 또는 특성 클래스에서만 유효합니다.
  • CS7014: 이 컨텍스트에서는 특성이 유효하지 않습니다.
  • CS7046: 특성 매개 변수를 지정해야 합니다.
  • CS7047: 특성 매개 변수 'parameter1' 또는 'parameter2'를 지정해야 합니다.
  • CS7067: 특성 생성자 매개 변수는 선택 사항이지만 기본 매개 변수 값은 지정되지 않았습니다.
  • CS8959: type1에서 type2로의 표준 변환이 없으므로 CallerArgumentExpressionAttribute를 적용할 수 없습니다.
  • CS8960: 매개 변수에 적용된 CallerArgumentExpressionAttribute는 영향을 주지 않습니다. CallerLineNumberAttribute에 의해 재정의됩니다.
  • CS8961: 매개 변수에 적용된 CallerArgumentExpressionAttribute는 영향을 주지 않습니다. CallerFilePathAttribute에 의해 재정의됩니다.
  • CS8962: 매개 변수에 적용된 CallerArgumentExpressionAttribute는 영향을 주지 않습니다. CallerMemberNameAttribute에 의해 재정의됩니다.
  • CS8963: 매개 변수에 적용된 CallerArgumentExpressionAttribute는 영향을 주지 않습니다. 잘못된 매개 변수 이름으로 적용됩니다.
  • CS8968: 특성 형식 인수는 형식 매개 변수를 사용할 수 없습니다.
  • CS8970: 형식은 메타데이터로 나타낼 수 없으므로 이 컨텍스트에서 사용할 수 없습니다.
  • CS9331: 특성을 수동으로 적용할 수 없습니다.

특성 인수 및 매개 변수

특성 인수 또는 매개 변수를 잘못 사용하는 경우 다음 오류가 표시됩니다.

  • CS0181: 특성 생성자 매개 변수에는 유효한 특성 매개 변수 형식이 아닌 형식이 있습니다.
  • CS0416: 'type 매개 변수': 특성 인수는 형식 매개 변수를 사용할 수 없습니다.
  • CS0447: 특성은 형식 인수와 함께 사용할 수 없습니다.
  • CS0647: 특성을 내보내는 중 오류가 발생했습니다
  • CS7046: 특성 매개 변수를 지정해야 합니다.
  • CS7047: 특성 매개 변수 'parameter1' 또는 'parameter2'를 지정해야 합니다.
  • CS7067: 특성 생성자 매개 변수는 선택 사항이지만 기본 매개 변수 값은 지정되지 않았습니다.
  • CS8968: 특성 형식 인수는 형식 매개 변수를 사용할 수 없습니다.
  • CS8970: 형식은 메타데이터로 나타낼 수 없으므로 이 컨텍스트에서 사용할 수 없습니다.

이러한 오류를 수정하려면 다음 규칙을 따릅니다.

  • 특성 생성자 매개 변수는 유효한 특성 매개 변수 형식(CS0181)을 사용해야 합니다. C# 언어 사양은 특성 매개 변수 형식을 이러한 형식의 기본 형식(bool,,byte, char, double, float, int, longshort열거형 형식 및 string1차원 배열)objectSystem.Type로 제한합니다. 메타데이터에 나타낼 수 없는 함수 포인터 및 기타 형식은 유효한 특성 매개 변수 형식이 아닙니다.
  • 특성 인수는 컴파일 시간 상수 값이어야 하므로 형식 매개 변수를 특성 인수로 사용할 수 없습니다(CS0416). 컴파일러는 컴파일 시간에 특성 인수를 확인해야 하며 제네릭 형식이 생성될 때까지 형식 매개 변수를 알 수 없습니다.
  • 제네릭이 아닌 특성(CS0447)에는 형식 인수를 적용할 수 없습니다. 특성 클래스가 제네릭이 아닌 경우 해당 사용법은 꺾쇠 괄호 안에 형식 인수를 포함할 수 없습니다.
  • 특성 생성자에 전달된 모든 값은 올바른 형식을 지정하고 각 매개 변수(CS0647)의 유효한 범위 내에 있어야 합니다. 예를 들어 GuidAttribute 유효한 GUID 형식 문자열이 필요합니다.
  • 특성을 적용할 때 필요한 모든 특성 매개 변수를 제공해야 합니다(CS7046, CS7047). 특성의 생성자 서명을 확인하여 필수 매개 변수를 확인하고 각 매개 변수에 유효한 인수를 제공합니다.
  • 선택적 생성자 매개 변수를 사용하여 사용자 지정 특성을 정의할 때 해당 매개 변수의 기본값(CS7067)을 지정합니다. 호출자가 이러한 인수를 생략할 수 있도록 특성 생성자에서 구문을 parameterType parameterName = defaultValue 사용합니다.
  • 제네릭 특성 형식 인수는 형식 매개 변수(CS8968)가 아닌 구체적인 형식이어야 합니다. 컴파일러는 컴파일 시간에 제네릭 특성 형식 인수를 완전히 결정해야 하므로 열린 형식 매개 변수는 허용되지 않습니다.
  • 특성 인수로 사용되는 형식은 메타데이터(CS8970)에서 나타낼 수 있어야 합니다. 일부 생성된 형식(예: 관련된 dynamic 형식 또는 특정 튜플 요소 이름)은 메타데이터로 인코딩할 수 없으며 특성 형식 인수로 허용되지 않습니다.

자세한 내용은 특성에 대한 특성, 제네릭C# 언어 사양 섹션을 참조하세요.

비고

CS0447CS0647 은 더 이상 사용되지 않습니다. 현재 컴파일러는 이러한 오류를 내보내지 않습니다.

특성 클래스 요구 사항

필요한 제약 조건을 충족하지 않는 특성 클래스를 정의할 때 다음 오류가 표시됩니다.

  • CS0404: 이 선언 형식에서는 특성이 잘못되었습니다.
  • CS0579: 중복 특성
  • CS0616: 형식이 특성 클래스가 아닙니다.
  • CS0641: 이 특성은 System.Attribute에서 파생된 클래스에서만 유효합니다.
  • CS0653: 'class' 특성 클래스는 추상이므로 적용할 수 없습니다.
  • CS1614: 특성 이름이 모호합니다. '@name'을 사용하거나 '특성' 접미사를 명시적으로 포함합니다.

이러한 오류를 수정하려면 다음 규칙을 따릅니다.

  • 특성이 허용하는 선언 형식에만 특성을 AttributeUsageAttribute 적용합니다(CS0404). 특성 AttributeTargetsAttributeUsage 지정된 값을 확인하여 유효한 대상을 확인합니다.
  • 동일한 특성을 단일 대상에 두 번 이상 적용하는 경우 중복 항목을 제거하거나 특성(AllowMultiple = trueAttributeUsageAttribute)에 설정합니다. 기본적으로 특성은 각 대상에 한 번만 표시할 수 있습니다.
  • 특성 구문에 사용되는 형식은 System.Attribute을(를) 상속받아야 합니다(CS0616). 파생된 System.Attribute 클래스만 특성으로 사용할 수 있습니다. 다른 형식은 이름이 비슷한 경우에도 이 오류를 발생합니다.
  • AttributeUsageAttributeAttribute에서 파생된 클래스에만 적용할 수 있습니다(CS0641). 특성은 AttributeUsage 다른 특성이 사용되는 방식을 제어하며 그 자체가 특성 클래스로 제한됩니다.
  • 특성 클래스는 null일 수 없습니다. 컴파일러가 인스턴스화해야 하기 때문입니다(CS0653). abstract 특성 클래스에서 한정자를 제거하거나 추상 기반에서 구체적인 클래스를 파생합니다.
  • ExampleExampleAttribute 특성 클래스가 모두 존재하는 경우, 컴파일러는 [Example]가 어떤 것을 참조하는지 알 수 없습니다(CS1614). [@Example]는 짧은 이름에, [ExampleAttribute]는 긴 이름에 사용하여 명확하게 구분합니다.

자세한 내용은 특성에 대한 사용자 지정 특성 만들기C# 언어 사양 섹션을 참조하세요.

특성 위치 컨텍스트

잘못된 위치에 특성을 적용하거나 잘못된 대상 지정자를 사용하는 경우 다음 오류가 발생합니다.

  • CS0592: 이 선언 형식에서는 특성이 잘못되었습니다. 특정 선언에서만 유효합니다.
  • CS0657: 위치가 이 선언에 유효한 특성 위치가 아닙니다. 이 선언에 대한 유효한 특성 위치가 나열됩니다. 이 블록의 모든 특성은 무시됩니다.
  • CS0658: 위치가 인식된 특성 위치가 아닙니다. 이 선언에 대한 유효한 특성 위치가 나열됩니다. 이 블록의 모든 특성은 무시됩니다.
  • CS1667: 속성이나 이벤트 접근자에 이 특성은 유효하지 않습니다. 특정 선언에서만 유효합니다.
  • CS7014: 이 컨텍스트에서는 특성이 유효하지 않습니다.

이러한 오류를 수정하려면 다음 규칙을 따릅니다. 자세한 내용은 특성 사양에 대한 특성 대상C# 언어 사양 섹션을 참조하세요.

  • 각 특성은 AttributeUsageAttribute 대상으로 하는 선언 형식을 지정합니다. 해당 형식에만 특성을 적용해야 합니다(CS0592). 예를 들어 클래스에 정의된 AttributeTargets.Interface 특성을 적용할 수 없습니다.
  • 특성 대상 지정자(예: method: 또는 property:)를 사용하는 경우 지정자는 표시되는 선언에 대해 유효해야 합니다(CS0657). 오류 메시지를 확인하여 특정 선언에 허용되는 대상 지정자를 확인합니다.
  • 사용한 특성 대상 지정자가 인식된 지정자가 아닙니다(CS0658). 유효한 지정자는 , ,assembly:, module:, type:method:, property:, field:event:param:를 포함합니다return:.
  • ObsoleteAttributeCLSCompliantAttribute와 같은 일부 특성은 속성 또는 이벤트 접근자(CS1667)에서 유효하지 않습니다. 접근자에서 속성 또는 이벤트 선언 자체로 특성을 이동합니다.
  • 특성을 지원하는 프로그램 요소에만 특성이 나타날 수 있습니다(CS7014). 어셈블리 수준 또는 모듈 수준 특성을 적용하는 경우, assembly: 또는 module: 대상 지정자를 사용하여 파일 맨 위에 배치하십시오.

미리 정의된 특성

미리 정의된 특정 .NET 특성을 잘못 사용하는 경우 다음 오류가 발생합니다.

  • CS0415: 이 특성은 명시적 인터페이스 멤버 선언이 아닌 인덱서에서만 유효합니다.
  • CS0609: 재정의로 표시된 인덱서에서 특성을 설정할 수 없습니다.
  • CS0625: StructLayout(LayoutKind.Explicit)으로 표시된 형식의 인스턴스 필드에는 FieldOffset 특성이 있어야 합니다.
  • CS0636: FieldOffset 특성은 StructLayout(LayoutKind.Explicit)으로 표시된 형식의 멤버에만 배치할 수 있습니다.
  • CS0637: FieldOffset 특성은 정적 또는 const 필드에서 허용되지 않습니다.
  • CS0646: 인덱서가 포함된 형식에서 DefaultMember 특성을 지정할 수 없습니다.
  • CS0668: 두 인덱서의 이름은 서로 다릅니다. IndexerName 특성은 형식 내의 모든 인덱서에서 동일한 이름으로 사용해야 합니다.
  • CS0735: TypeForwardedTo 특성의 인수로 지정된 형식이 잘못되었습니다.
  • CS0739: Duplicate TypeForwardedToAttribute
  • CS1608: C# 형식에서는 RequiredAttribute 특성이 허용되지 않습니다.
  • CS9331: 특성을 수동으로 적용할 수 없습니다.

이러한 오류를 수정하려면 다음 규칙을 따릅니다. 자세한 내용은 인덱서, 구조체 형식TypeForwardedToAttribute플랫폼 호출(P/Invoke)을 참조하세요.

  • 명시적 인터페이스 멤버 선언(CS0415)이 아닌 인덱서에만 IndexerNameAttribute를 적용할 수 있습니다. 인터페이스가 이미 인덱서 이름을 정의하므로 명시적 인터페이스 인덱서에서 특성을 제거합니다.
  • 재정의 인덱서는 기본 클래스에서 이름을 상속받기 때문에 IndexerName을(를) override로 표시된 인덱서에 적용할 수 없습니다(CS0609). 재정의 IndexerName 인덱서에서 속성을 제거합니다.
  • 표시된 StructLayout(LayoutKind.Explicit) 형식의 모든 인스턴스 필드에는 FieldOffsetAttribute (CS0625)가 있어야 합니다. 명시적 레이아웃을 사용하려면 각 인스턴스 필드에 대한 바이트 오프셋을 지정해야 합니다.
  • FieldOffsetAttributeLayoutKind.Explicit로 설정된 StructLayoutAttribute 형식의 멤버에만 배치할 수 있습니다 (CS0636). StructLayout 포함하는 형식 선언에 특성을 추가합니다.
  • 명시적 레이아웃은 인스턴스 필드에만 적용되므로 FieldOffset 특성이 static 또는 const 필드에 허용되지 않습니다 (CS0637). FieldOffset 정적 또는 const 필드에서 특성을 제거합니다.
  • 컴파일러가 인덱서를 사용하여 형식의 기본 멤버를 자동으로 정의하므로 인덱서가 이미 포함된 형식에는 적용 DefaultMemberAttribute 할 수 없습니다(CS0646). DefaultMember 특성을 제거합니다.
  • 형식 내의 모든 IndexerNameAttribute 특성은 동일한 이름(CS0668)을 지정해야 합니다. 런타임이 형식의 모든 인덱서에 단일 이름을 사용하므로 일치하도록 이름을 변경합니다.
  • 인수 TypeForwardedToAttribute 로 지정된 형식은 제네릭이 아닌 중첩되지 않은 포인터가 아닌 비 배열 형식(CS0735)이어야 합니다. 최상위 명명된 형식만 유효한 전달 대상입니다.
  • 어셈블리는 각 외부 형식(TypeForwardedToAttribute)에 대해 하나 만 가질 수 있습니다. 중복 TypeForwardedTo 선언을 찾아 제거합니다.
  • RequiredAttributeAttribute C#(CS1608)에 정의된 형식에는 허용되지 않습니다. 이 특성은 컴파일러에 특정 기능이 필요하도록 강제 적용해야 하는 다른 언어용으로 예약되어 있습니다.
  • 일부 특성은 컴파일러용으로 예약되어 있으며 소스 코드(CS9331)에서 수동으로 적용할 수 없습니다. 특성을 컴파일러에서 생성하도록 하는 해당하는 C# 언어 구문으로 바꿉다.

조건부 특성 사용

사용 제한을 위반하는 방식으로 적용 ConditionalAttribute 하면 다음과 같은 오류가 표시됩니다.

  • CS0243: 조건부 특성은 재정의 메서드이므로 'method'에서 유효하지 않습니다.
  • CS0577: 조건부 특성은 생성자, 소멸자, 연산자, 람다 식 또는 명시적 인터페이스 구현이므로 유효하지 않습니다.
  • CS0578: 반환 형식이 void가 아니므로 조건부 특성이 'function'에서 유효하지 않습니다.
  • CS0582: 조건부 특성이 인터페이스 멤버에서 유효하지 않습니다.
  • CS0629: 조건부 멤버 'member'는 'Type Name' 형식의 인터페이스 멤버 '기본 클래스 멤버'를 구현할 수 없습니다.
  • CS0685: 조건부 멤버 'member'에는 out 매개 변수가 있을 수 없습니다.
  • CS1618: 메서드 또는 재정의하는 메서드에 조건부 특성이 있으므로 메서드를 사용하여 대리자를 만들 수 없습니다.
  • CS1689: 특성은 메서드 또는 특성 클래스에서만 유효합니다.

이러한 오류를 수정하려면 다음 규칙을 따릅니다. 자세한 내용은 ConditionalAttribute, 특성를 참조하세요.

  • 컴파일러는 기본 메서드 선언에 대한 호출을 바인딩하고 재정의 메서드에는 그렇지 않으므로 Conditional 특성을 재정의하는 메서드에 적용할 수 없습니다(CS0243). 재정의 메서드에서 Conditional 특성을 제거하거나 override 키워드를 제거합니다.
  • Conditional 생성자, 종료자, 연산자, 람다 식 또는 명시적 인터페이스 구현(CS0577)에서는 이 특성이 유효하지 않습니다. 이러한 멤버 형식은 형식의 수명 주기 또는 계약에 필요한 역할이 있으므로 조건부로 생략할 수 없습니다.
  • 컴파일러가 호출을 완전히 생략할 수 있고 호출자가 반환 값을 사용할 수 없으므로 조건부 메서드는 반환 void 해야 합니다(CS0578). 메서드의 반환 형식을 void으로 변경하거나 Conditional 특성을 제거합니다.
  • 모든 인터페이스 멤버를 구현해야 하므로 인터페이스 멤버는 조건부일 수 없습니다(CS0582). Conditional 인터페이스 멤버 선언에서 특성을 제거합니다.
  • 인터페이스 계약을 사용하려면 인터페이스 멤버가 모든 빌드(CS0629)에 있어야 하므로 인터페이스 멤버를 구현하는 메서드는 조건부일 수 없습니다. Conditional 구현 메서드에서 특성을 제거합니다.
  • 컴파일러가 메서드 호출(out)을 생략할 때 변수 값이 정의되지 않으므로 조건부 메서드에는 매개 변수 out 가 있을 수 없습니다. 메서드에서 out 매개 변수를 제거하거나 Conditional 특성을 제거하십시오.
  • 조건부 메서드가 정의되지 않은 빌드에 메서드가 없을 수 있으므로 조건부 메서드를 참조하는 대리자를 만들 수 없습니다(CS1618). Conditional 메서드에서 특성을 제거하거나 대리자 대상으로 사용하지 마세요.
  • 이 특성은 Conditional 메서드 및 특성 클래스(CS1689)에서만 유효합니다. 특성이 아닌 클래스, 구조체 또는 인터페이스와 같은 다른 선언 형식에서는 유효하지 않습니다.

CallerArgumentExpression 특성 사용

잘못 적용 CallerArgumentExpressionAttribute 하거나 다른 호출자 정보 특성과 충돌하는 경우 다음 오류가 발생합니다.

  • CS8959: type1에서 type2로의 표준 변환이 없으므로 CallerArgumentExpressionAttribute를 적용할 수 없습니다.
  • CS8960: 매개 변수에 적용된 CallerArgumentExpressionAttribute는 영향을 주지 않습니다. CallerLineNumberAttribute에 의해 재정의됩니다.
  • CS8961: 매개 변수에 적용된 CallerArgumentExpressionAttribute는 영향을 주지 않습니다. CallerFilePathAttribute에 의해 재정의됩니다.
  • CS8962: 매개 변수에 적용된 CallerArgumentExpressionAttribute는 영향을 주지 않습니다. CallerMemberNameAttribute에 의해 재정의됩니다.
  • CS8963: 매개 변수에 적용된 CallerArgumentExpressionAttribute는 영향을 주지 않습니다. 잘못된 매개 변수 이름으로 적용됩니다.

이러한 오류를 수정하려면 다음 규칙을 따릅니다. 자세한 내용은 호출자 정보 특성CallerArgumentExpressionAttribute.

  • 호출자의 인수 식(CS8959)의 표현을 삽입하는 속성 때문에, CallerArgumentExpression으로 데코레이트된 매개 변수는 string 타입이거나 string로부터의 표준 변환을 가지는 타입이어야 합니다. 매개 변수 형식을 string 호환되는 형식으로 변경합니다.
  • 매개변수가 CallerLineNumberAttribute, CallerFilePathAttribute, 또는 CallerMemberNameAttribute(CS8960, CS8961, CS8962) 속성을 가질 경우, CallerArgumentExpression 속성은 아무런 영향을 주지 않습니다. 이러한 호출자 정보 특성이 우선하므로 매개 변수에서 특성을 제거 CallerArgumentExpression 합니다.
  • 생성자에 전달된 CallerArgumentExpression 문자열 인수는 동일한 메서드 서명(CS8963)에 있는 다른 매개 변수의 이름과 일치해야 합니다. 매개 변수 이름의 철자가 잘못되었거나 존재하지 않는 매개 변수를 참조하는 경우 특성은 영향을 주지 않습니다.