이 문서에서는 다음 컴파일러 오류를 다룹니다.
- 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# 언어 사양 섹션을 참조하세요.
비고
CS0447 및 CS0647 은 더 이상 사용되지 않습니다. 현재 컴파일러는 이러한 오류를 내보내지 않습니다.
특성 클래스 요구 사항
필요한 제약 조건을 충족하지 않는 특성 클래스를 정의할 때 다음 오류가 표시됩니다.
- CS0404: 이 선언 형식에서는 특성이 잘못되었습니다.
- CS0579: 중복 특성
- CS0616: 형식이 특성 클래스가 아닙니다.
- CS0641: 이 특성은 System.Attribute에서 파생된 클래스에서만 유효합니다.
- CS0653: 'class' 특성 클래스는 추상이므로 적용할 수 없습니다.
- CS1614: 특성 이름이 모호합니다. '@name'을 사용하거나 '특성' 접미사를 명시적으로 포함합니다.
이러한 오류를 수정하려면 다음 규칙을 따릅니다.
- 특성이 허용하는 선언 형식에만 특성을 AttributeUsageAttribute 적용합니다(CS0404). 특성
AttributeTargets에AttributeUsage지정된 값을 확인하여 유효한 대상을 확인합니다. - 동일한 특성을 단일 대상에 두 번 이상 적용하는 경우 중복 항목을 제거하거나 특성(
AllowMultiple = trueAttributeUsageAttribute)에 설정합니다. 기본적으로 특성은 각 대상에 한 번만 표시할 수 있습니다. - 특성 구문에 사용되는 형식은 System.Attribute을(를) 상속받아야 합니다(CS0616). 파생된
System.Attribute클래스만 특성으로 사용할 수 있습니다. 다른 형식은 이름이 비슷한 경우에도 이 오류를 발생합니다. -
AttributeUsageAttribute는
Attribute에서 파생된 클래스에만 적용할 수 있습니다(CS0641). 특성은AttributeUsage다른 특성이 사용되는 방식을 제어하며 그 자체가 특성 클래스로 제한됩니다. - 특성 클래스는 null일 수 없습니다. 컴파일러가 인스턴스화해야 하기 때문입니다(CS0653).
abstract특성 클래스에서 한정자를 제거하거나 추상 기반에서 구체적인 클래스를 파생합니다. -
Example와ExampleAttribute특성 클래스가 모두 존재하는 경우, 컴파일러는[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:. - ObsoleteAttribute 및 CLSCompliantAttribute와 같은 일부 특성은 속성 또는 이벤트 접근자(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)가 있어야 합니다. 명시적 레이아웃을 사용하려면 각 인스턴스 필드에 대한 바이트 오프셋을 지정해야 합니다. -
FieldOffsetAttribute는
LayoutKind.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)에 있는 다른 매개 변수의 이름과 일치해야 합니다. 매개 변수 이름의 철자가 잘못되었거나 존재하지 않는 매개 변수를 참조하는 경우 특성은 영향을 주지 않습니다.
.NET