제네릭 형식 매개 변수 및 제네릭 형식 인수와 관련된 오류 및 경고 해결

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

  • CS0080: 제네릭이 아닌 선언에서는 제약 조건이 허용되지 않습니다.
  • CS0081: 형식 매개 변수 선언은 형식이 아닌 식별자여야 합니다.
  • CS0224: vararg를 사용하는 메서드는 제네릭이거나 제네릭 형식이거나 매개 변수가 있을 수 없습니다.
  • CS0304: 제약 조건이 없으므로 변수 형식의 인스턴스를 new() 만들 수 없습니다.
  • CS0305: 제네릭 형식을 사용하려면 N 형식 인수가 필요합니다.
  • CS0306: 형식을 형식 인수로 사용할 수 없습니다.
  • CS0307: 'identifier'는 형식 인수와 함께 사용할 수 없습니다.
  • CS0308: 제네릭이 아닌 형식 또는 메서드는 형식 인수와 함께 사용할 수 없습니다.
  • CS0310: 형식을 제네릭 형식 또는 메서드의 매개 변수로 사용하려면 공용 매개 변수가 없는 생성자가 있는 비 추상 형식이어야 합니다.
  • CS0311: 제네릭 형식 또는 메서드에서 형식 매개 변수 T 로 형식을 사용할 수 없습니다. 'type1'에서 'type2'로의 암시적 참조 변환은 없습니다.
  • CS0312: 'type1' 형식은 제네릭 형식 또는 메서드에서 형식 매개 변수로 사용할 수 없습니다. nullable 형식 'type1'이 '제약 조건'의 제약 조건을 충족하지 않습니다.
  • CS0313: 'type1' 형식은 제네릭 형식 또는 메서드에서 형식 매개 변수로 사용할 수 없습니다. nullable 형식 'type1'이 '제약 조건'의 제약 조건을 충족하지 않습니다. Nullable 형식은 인터페이스 제약 조건을 충족할 수 없습니다.
  • CS0314: 제네릭 형식 또는 메서드에서 해당 형식을 형식 매개 변수로 사용할 수 없습니다. 'type'에서 'constraint'로의 박싱 변환 또는 형식 매개 변수 변환이 없습니다.
  • CS0315: 형식은 제네릭 형식 또는 메서드에서 형식 매개 변수 T로 사용할 수 없습니다. 'type'에서 'constraint'로의 boxing 변환이 없습니다.
  • CS0401: 제약 조건은 new() 지정된 마지막 제한 제약 조건이어야 합니다.
  • CS0403: null이 아닌 값 형식일 수 있으므로 null을 형식 매개 변수로 변환할 수 없습니다. 대신 사용하는 default(T) 것이 좋습니다.
  • CS0405: 형식 매개 변수에 대한 중복 제약 조건입니다.
  • CS0406: 클래스 형식 제약 조건 '제약 조건'은 다른 제약 조건 앞에 와야 합니다.
  • CS0409: 형식 매개 변수 'type 매개 변수'에 대해 제약 조건 절이 이미 지정되었습니다. 형식 매개 변수에 대한 모든 제약 조건은 단일 where 절에 지정해야 합니다.
  • CS0411: 메서드 'method'의 형식 인수는 사용법에서 유추할 수 없습니다. 형식 인수를 명시적으로 지정해 보세요.
  • CS0412: 매개 변수: 매개 변수, 지역 변수 또는 로컬 함수는 메서드 형식 매개 변수와 같은 이름을 가질 수 없습니다.
  • CS0413: 클래스 형식 제약 조건이나 as 제약 조건이 없으므로 형식 매개 변수를 연산자에 사용할 class 수 없습니다.
  • CS0417: 식별자: 변수 형식의 인스턴스를 만들 때 인수를 제공할 수 없습니다.
  • CS0449: class, struct, , unmanagednotnulldefault 제약 조건은 결합하거나 복제할 수 없으며 제약 조건 목록에서 먼저 지정해야 합니다.
  • CS0450: 형식 매개 변수: 제약 조건 클래스와 class 제약 struct 조건을 둘 다 지정할 수 없습니다.
  • CS0451: 제약 조건을 new() 제약 조건과 함께 struct 사용할 수 없습니다.
  • CS0452: 'type name' 형식은 제네릭 형식 또는 메서드 'generic'에서 매개 변수 '매개 변수 이름'으로 사용하려면 참조 형식이어야 합니다.
  • CS0453: 제네릭 형식 또는 메서드 'generic'에서 'parameter name' 매개 변수로 사용하려면 'type name' 형식이 nullable이 아닌 값 형식이어야 합니다.
  • CS0454: 형식 매개 변수 1 및 형식 매개 변수 2와 관련된 순환 제약 조건 종속성입니다.
  • CS0455: 형식 매개 변수는 충돌하는 제약 조건 'constraint1' 및 'constraint2'를 상속합니다.
  • CS0456: 형식 매개 변수 'type 매개 변수 1'에 'struct' 제약 조건이 있으므로 'type 매개 변수 1'을 'type 매개 변수 2'에 대한 제약 조건으로 사용할 수 없습니다.
  • CS0693: 형식 매개 변수 'type 매개 변수'는 외부 형식 'type'의 형식 매개 변수와 이름이 같습니다.
  • CS0694: 형식 매개 변수의 이름은 포함하는 형식 또는 메서드와 같습니다.
  • CS0695: 'type'은 일부 형식 매개 변수 대체에 대해 통합될 수 있으므로 'interface1' 및 'interface2'를 모두 구현할 수 없습니다.
  • CS0698: 제네릭 형식은 특성 클래스이므로 형식에서 파생될 수 없습니다.
  • CS0699: 'generic'는 형식 매개 변수 'identifier'를 정의하지 않습니다.
  • CS0701: 'identifier'가 유효한 제약 조건이 아닙니다. 제약 조건으로 사용되는 형식은 인터페이스, 봉인되지 않은 클래스 또는 형식 매개 변수여야 합니다.
  • CS0702: 제약 조건은 특수 클래스일 수 없습니다.
  • CS0703: 일관성 없는 접근성: 제약 조건 형식은 선언보다 접근성이 떨어집니다.
  • CS0704: 형식 매개 변수이므로 'type'에서 가상 멤버가 아닌 멤버 조회를 수행할 수 없습니다.
  • CS0706: 잘못된 제약 조건 형식입니다. 제약 조건으로 사용되는 형식은 인터페이스, 봉인되지 않은 클래스 또는 형식 매개 변수여야 합니다.
  • CS0717: 정적 클래스: 정적 클래스를 제약 조건으로 사용할 수 없습니다.
  • CS0718: 'type': 정적 형식은 형식 인수로 사용할 수 없습니다.
  • CS1720: 식은 '제네릭 형식'의 기본값이 null이므로 항상 System.NullReferenceException을 발생합니다.
  • CS1763: 'parameter'는 'type' 형식입니다. 문자열 이외의 참조 형식의 기본 매개 변수 값은 null로만 초기화할 수 있습니다.
  • CS1948: 범위 변수 'name'은 메서드 형식 매개 변수와 같은 이름을 가질 수 없습니다.
  • CS1960: 잘못된 분산 한정자입니다. 인터페이스 및 대리자 형식 매개 변수만 variant로 지정할 수 있습니다.
  • CS1961: 잘못된 분산: 형식 매개 변수는 'type'에서 공변적으로 유효해야 합니다. 'type 매개 변수'는 반공변입니다.
  • CS3024: 제약 조건 형식 'type'이 CLS 규격이 아닙니다.
  • CS7002: 제네릭 이름을 예기치 않게 사용했습니다.
  • CS8322: 동적 형식의 인수를 유추된 형식 인수를 사용하여 제네릭 로컬 함수에 전달할 수 없습니다.
  • CS8375: 'new()' 제약 조건은 '관리되지 않는' 제약 조건과 함께 사용할 수 없습니다.
  • CS8377: 제네릭 형식 또는 메서드 'generic'에서 'parameter' 매개 변수로 사용하려면 'type' 형식이 nullable이 아닌 값 형식이어야 하며 중첩 수준의 모든 필드와 함께 사용해야 합니다.
  • CS8379: 형식 매개 변수 'type 매개 변수 1'에 '관리되지 않는' 제약 조건이 있으므로 'type 매개 변수 1'을 'type 매개 변수 2'에 대한 제약 조건으로 사용할 수 없습니다.
  • CS8380: 'type': 제약 조건 클래스와 '관리되지 않는' 제약 조건을 둘 다 지정할 수 없습니다.
  • CS8387: 형식 매개 변수 'type 매개 변수'는 외부 메서드 'method'의 형식 매개 변수와 이름이 같습니다.
  • CS8389: 현재 컨텍스트에서는 형식 인수를 생략할 수 없습니다.
  • CS8427: 열거형, 클래스 및 구조체는 'in' 또는 'out' 형식 매개 변수가 있는 인터페이스에서 선언할 수 없습니다.
  • CS8665: 'method' 메서드는 형식 매개 변수 'type 매개 변수'에 대해 'class' 제약 조건을 지정하지만 재정의되거나 명시적으로 구현된 메서드 'method'의 해당 형식 매개 변수 'type 매개 변수'는 참조 형식이 아닙니다.
  • CS8666: 'method' 메서드는 형식 매개 변수 'type 매개 변수'에 대해 'struct' 제약 조건을 지정하지만 재정의되거나 명시적으로 구현된 메서드 'method'의 해당 형식 매개 변수 'type 매개 변수'는 null을 허용하지 않는 값 형식이 아닙니다.
  • CS8822: 'method' 메서드는 형식 매개 변수 'type 매개 변수'에 대한 'default' 제약 조건을 지정하지만 재정의되거나 명시적으로 구현된 메서드 'method'의 해당 형식 매개 변수 'type 매개 변수'는 참조 형식 또는 값 형식으로 제한됩니다.
  • CS8823: 'default' 제약 조건은 재정의 및 명시적 인터페이스 구현 메서드에만 유효합니다.
  • CS8893: 'type'은 'UnmanagedCallersOnly'에 유효한 호출 규칙 형식이 아닙니다.
  • CS8894: 'UnmanagedCallersOnly'로 특성이 지정된 메서드에서 'type'을 매개 변수 또는 반환 형식으로 사용할 수 없습니다.
  • CS8895: 'UnmanagedCallersOnly'로 특성이 지정된 메서드는 제네릭 형식 매개 변수를 가질 수 없으며 제네릭 형식으로 선언할 수 없습니다.
  • CS8896: 'UnmanagedCallersOnly'는 일반 정적 비추상, 비 가상 메서드 또는 정적 로컬 함수에만 적용할 수 있습니다.
  • CS9011: 키워드 delegate 를 제약 조건으로 사용할 수 없습니다. System.Delegate를 의미하셨습니까?
  • CS9012: 예기치 않은 키워드 record. record struct 또는 record class 중 하나를 의미하셨습니까?
  • CS9338: 일관성 없는 접근성: 형식은 클래스보다 접근성이 떨어집니다.

형식 매개 변수 선언 및 명명

  • CS0080: 제네릭이 아닌 선언에서는 제약 조건이 허용되지 않습니다.
  • CS0081: 형식 매개 변수 선언은 형식이 아닌 식별자여야 합니다.
  • CS0412: 매개 변수: 매개 변수, 지역 변수 또는 로컬 함수는 메서드 형식 매개 변수와 같은 이름을 가질 수 없습니다.
  • CS0693: 형식 매개 변수 'type 매개 변수'는 외부 형식 'type'의 형식 매개 변수와 이름이 같습니다.
  • CS0694: 형식 매개 변수의 이름은 포함하는 형식 또는 메서드와 같습니다.
  • CS0699: 'generic'는 형식 매개 변수 'identifier'를 정의하지 않습니다.
  • CS1948: 범위 변수 'name'은 메서드 형식 매개 변수와 같은 이름을 가질 수 없습니다.
  • CS8387: 형식 매개 변수 'type 매개 변수'는 외부 메서드 'method'의 형식 매개 변수와 이름이 같습니다.
  • CS9012: 예기치 않은 키워드 record. record struct 또는 record class를 의미하셨습니까?

이러한 오류는 제네릭 형식 및 메서드에서 형식 매개 변수를 선언하고 이름을 지정하는 방법과 관련이 있습니다. 형식 매개 변수 이름은 유효한 식별자여야 하며 범위의 다른 식별자와 충돌해서는 안 되며 선언의 형식 매개 변수 목록에 표시되어야 합니다.

  • 제네릭이 아닌 선언(CS0080)에서 제약 조건 절을 제거합니다. 이 절은 where 형식 매개 변수를 선언하는 제네릭 형식 및 메서드에서만 사용할 수 있습니다. 제약 조건을 적용해야 하는 경우 먼저 형식 또는 메서드 선언에 형식 매개 변수를 추가합니다.
  • 실제 형식 이름을 형식 매개 변수 선언의 식별자(CS0081)로 대체합니다. 구체적인 형식(예 TTKey: 또는 )이 아닌 식별자(예: TValueint또는string)를 사용하여 형식 매개 변수를 선언해야 합니다. 형식 매개 변수의 목적은 제네릭 형식 또는 메서드를 사용할 때 컴파일러가 실제 형식으로 대체하는 자리 표시자 역할을 하는 것입니다.
  • 이름 충돌을 방지하기 위해 형식 매개 변수, 지역 변수, 매개 변수 또는 범위 변수의 이름을 바꿉니다(CS0412, CS0694, CS1948). 형식 매개 변수 이름은 동일한 범위의 섀도 식별자를 사용할 수 없으며 포함하는 형식 또는 메서드의 이름과 일치할 수 없습니다. LINQ 범위 변수는 메서드의 형식 매개 변수 이름을 다시 사용할 수도 없습니다. 이러한 충돌은 참조되는 식별자에 대한 모호성을 만듭니다.
  • 외부 매개 변수를 숨기는 내부 형식 매개 변수에 다른 이름을 사용합니다(CS0693, CS8387). 제네릭 멤버(예: 메서드 또는 중첩 형식)가 제네릭 클래스 또는 메서드 내에 있는 경우 내부 형식 매개 변수가 외부 매개 변수와 반드시 같은 것은 아닙니다. 동일한 이름을 지정하면 참조되는 형식 매개 변수에 대한 혼동이 발생합니다. 내부 형식 매개 변수에 고유한 이름을 사용합니다.
  • 제약 조건 절의 모든 형식 매개 변수가 형식 매개 변수 목록(CS0699)에 선언되어 있는지 확인합니다. where 절은 제네릭 선언에 나타나는 형식 매개변수만 참조할 수 있습니다. 절의 where 이름이 선언된 형식 매개 변수와 일치하지 않는 경우 오타 또는 맞춤법 오류를 확인합니다.
  • 올바른 레코드 선언 구문(CS9012)을 사용합니다. 레코드 형식을 선언할 때, record class 또는 record struct를 사용해야 하며, 참조 형식의 경우는 record만 사용할 수 있습니다. 키워드만으로는 record 컴파일러가 다른 선언 구문을 예상하는 위치에 표시할 수 없습니다.

자세한 내용은 제네릭 형식 매개 변수제네릭을 참조하세요.

제약 조건 선언 및 순서 지정

  • CS0401: 제약 조건은 new() 지정된 마지막 제한 제약 조건이어야 합니다.
  • CS0406: 클래스 형식 제약 조건 '제약 조건'은 다른 제약 조건 앞에 와야 합니다.
  • CS0409: 형식 매개 변수 'type 매개 변수'에 대해 제약 조건 절이 이미 지정되었습니다. 형식 매개 변수에 대한 모든 제약 조건은 단일 where 절에 지정해야 합니다.
  • CS0449: class, struct, , unmanagednotnulldefault 제약 조건은 결합하거나 복제할 수 없으며 제약 조건 목록에서 먼저 지정해야 합니다.
  • CS0450: 형식 매개 변수: 제약 조건 클래스와 class 제약 struct 조건을 둘 다 지정할 수 없습니다.
  • CS0451: new() 제약 조건은 struct 제약 조건과 함께 사용할 수 없습니다.
  • CS8375: 'new()' 제약 조건은 '관리되지 않는' 제약 조건과 함께 사용할 수 없습니다.
  • CS8380: 'type': 제약 조건 클래스와 '관리되지 않는' 제약 조건을 둘 다 지정할 수 없습니다.
  • CS9011: 키워드 delegate를 제약 조건으로 사용할 수 없습니다. 혹시 System.Delegate를 의미하셨습니까?

형식 매개 변수에 대한 제약 조건은 특정 순서를 따라야 합니다. 즉, 기본 제약 조건(class, struct, , unmanagednotnull또는default)이 먼저 오고 클래스 형식 제약 조건이 뒤에 인터페이스 제약 조건과 마지막으로 new() 생성자 제약 조건이 와야 합니다. 일부 제약 조건은 함께 사용할 수 없으며 결합할 수 없습니다. 단일 형식 매개 변수에 대한 모든 제약 조건은 단일 where 절에 표시되어야 합니다.

  • 제약 조건 new() 목록의 끝에 제약 조건을 배치합니다(CS0401). 제약 조건은 new() 다른 모든 제약 조건 후에 나타나야 합니다. 예를 들어 where T : new(), IDisposablewhere T : IDisposable, new()로 변경합니다.
  • 클래스 형식 제약 조건을 인터페이스 제약 조건 앞에 배치합니다(CS0406). 형식 매개 변수를 인터페이스와 함께 특정 기본 클래스로 제한하는 경우 클래스가 먼저 나타나야 합니다. 예를 들어 where T : IDisposable, MyBaseClasswhere T : MyBaseClass, IDisposable로 변경합니다.
  • 형식 매개 변수에 대한 모든 제약 조건을 단일 where 절(CS0409)으로 결합합니다. 동일한 형식 매개 변수에 대해 여러 where 절을 사용할 수 없습니다. 하나의 절로 병합: where T : I where T : new()을(를) where T : I, new()로 변경합니다. 여러 where 절은 서로 다른 형식 매개 변수를 대상으로 하는 경우에만 유효합니다.
  • 주 제약 조건을 먼저 배치하고 상호 배타적 제약 조건(CS0449)을 결합하지 마세요. , , classstructunmanaged또는 notnull중 하나default만 지정할 수 있으며 제약 조건 목록에 먼저 나타나야 합니다. classstruct 제약 조건은 상호 배타적이며, classunmanaged도 마찬가지입니다.
  • 특정 클래스 제약 조건을 class, struct 또는 unmanaged와 함께 사용하지 마세요(CS0450, CS8380). 형식 매개 변수가 특정 클래스 형식으로 제한되는 경우 암시적으로 참조 형식이며 이는 또는 struct 제약 조건과 unmanaged 모순됩니다. 클래스 제약 조건 또는 기본 제약 조건을 제거합니다.
  • new()을(를) struct 또는 unmanaged와 함께 사용하지 마세요 (CS0451, CS8375). 모든 값 형식에는 암시적으로 공용 매개 변수가 없는 생성자가 있으므로 new() 제약 조건과 struct결합하면 중복됩니다. unmanaged에도 동일하게 적용되며, 이는 struct을 의미합니다. 제약 조건을 제거합니다 new() .
  • 제약 조건 절(CS9011)에서 delegateSystem.Delegate으로 대체합니다. 키워드 delegate는 제약 조건으로 사용되지 않고 대리자 형식을 선언하기 위해 사용됩니다. 형식 매개 변수를 위임 형식으로 제한하려면 제약 조건 형식으로 사용합니다 System.Delegate .

자세한 내용은 형식 매개 변수에 대한 제약 조건을 참조하세요.

유효한 제약 조건 형식

  • CS0405: 형식 매개 변수에 대한 중복 제약 조건입니다.
  • CS0701: 'identifier'가 유효한 제약 조건이 아닙니다. 제약 조건으로 사용되는 형식은 인터페이스, 봉인되지 않은 클래스 또는 형식 매개 변수여야 합니다.
  • CS0702: 제약 조건은 특수 클래스일 수 없습니다.
  • CS0703: 일관성 없는 접근성: 제약 조건 형식은 선언보다 접근성이 떨어집니다.
  • CS0706: 잘못된 제약 조건 형식입니다. 제약 조건으로 사용되는 형식은 인터페이스, 봉인되지 않은 클래스 또는 형식 매개 변수여야 합니다.
  • CS0717: 정적 클래스: 정적 클래스를 제약 조건으로 사용할 수 없습니다.
  • CS3024: 제약 조건 형식 'type'이 CLS 규격이 아닙니다.

제약 조건은 인터페이스, 봉인되지 않은 클래스 또는 형식 매개 변수여야 합니다. 특정 형식은 .NET 형식 시스템에서 특별한 의미가 있거나 상속될 수 없기 때문에 제약 조건으로 유효하지 않습니다.

  • 중복 제약 조건 제거(CS0405). 각 제약 조건은 제약 조건 절에 한 번만 나타날 수 있습니다. where T : I, I가 있는 경우, 중복 항목을 제거하십시오.
  • 봉인되지 않은 형식만 제약 조건으로 사용합니다(CS0701). 봉인된 클래스, 구조체 및 열거형은 상속할 수 없으므로 제약 조건으로 사용할 수 없습니다. 원하는 형식이 구현하는 인터페이스를 사용하거나 봉인되지 않은 기본 클래스를 사용합니다.
  • 특수 클래스를 제약 조건으로 사용하지 마세요(CS0702). 형식ObjectArray이며 ValueType 제약 조건으로 사용할 수 없습니다. 모든 형식은 Object이미 파생되므로 이를 제한하면 값이 없습니다. ArrayValueType는 직접 상속할 수 없는 추상 기본 형식입니다. 배열과 유사한 동작이 필요한 경우 IList<T> 또는 IEnumerable<T> 을 사용하십시오.
  • 제약 조건 형식이 제네릭 형식(CS0703)만큼은 최소한 액세스할 수 있는지 확인합니다. 외부 코드는 유효한 형식 인수를 제공할 수 없으므로 공용 제네릭 형식에는 내부 형식을 사용하는 제약 조건이 있을 수 없습니다. 제약 조건 형식을 공용으로 설정하거나 제네릭 형식의 접근성을 줄입니다.
  • 인터페이스, 봉인되지 않은 클래스 또는 형식 매개 변수만 제약 조건으로 사용합니다(CS0706). 배열, 봉인된 클래스, 구조체, 열거형 또는 기타 잘못된 형식을 제약 조건으로 사용할 수 없습니다. 원하는 형식이 구현하는 인터페이스를 사용하는 것이 좋습니다.
  • 정적 클래스를 제약 조건으로 사용하지 마세요(CS0717). 정적 클래스는 정적 멤버만 포함하므로 확장할 수 없습니다. 정적 클래스에서 파생할 수 있는 형식이 없으므로 제약 조건으로 사용할 수 없습니다.
  • 형식 제약 조건(CS3024)에 CLS 규격 형식을 사용합니다. 어셈블리가 표시된 [assembly: CLSCompliant(true)]경우 CLS 규격이 아닌 형식을 제네릭 형식 제약 조건으로 사용하면 일부 언어로 작성된 코드가 제네릭 클래스를 사용할 수 없게 될 수 있습니다.

자세한 내용은 형식 매개 변수에 대한 제약 조건을 참조하세요.

제약 조건 만족도 및 변환

  • CS0311: 제네릭 형식 또는 메서드에서 형식 매개 변수 T 로 형식을 사용할 수 없습니다. 'type1'에서 'type2'로의 암시적 참조 변환은 없습니다.
  • CS0312: 제네릭 형식 또는 메서드에서 형식 매개 변수로 형식을 사용할 수 없습니다. nullable 형식이 '제약 조건'의 제약 조건을 충족하지 않습니다.
  • CS0313: 제네릭 형식 또는 메서드에서 형식 매개 변수로 형식을 사용할 수 없습니다. nullable 형식이 '제약 조건'의 제약 조건을 충족하지 않습니다. Nullable 형식은 인터페이스 제약 조건을 충족할 수 없습니다.
  • CS0314: 해당 형식은 제네릭 형식 또는 메서드에서 형식 매개 변수로 사용할 수 없습니다. 'type'에서 'constraint'로의 boxing 변환 또는 형식 매개 변수 변환이 없습니다.
  • CS0315: 형식은 제네릭 형식 또는 메서드의 형식 매개 변수 T로 사용할 수 없습니다. 'type'에서 'constraint'로의 박싱 변환이 없습니다.
  • CS0452: 'type name' 형식은 제네릭 형식 또는 메서드 'generic'에서 매개 변수 '매개 변수 이름'으로 사용하려면 참조 형식이어야 합니다.
  • CS0453: 제네릭 형식 또는 메서드 'generic'에서 'parameter name' 매개 변수로 사용하려면 'type name' 형식이 nullable이 아닌 값 형식이어야 합니다.
  • CS8377: 제네릭 형식 또는 메서드 'generic'의 'parameter' 매개 변수로 사용하려면 'type' 형식은 모든 중첩 수준의 모든 필드를 포함하여 null을 허용하지 않는 값 형식이어야 합니다.

이러한 오류는 형식 인수가 제네릭 형식 매개 변수에 선언된 제약 조건을 충족하지 않을 때 발생합니다. 형식 인수에는 모든 제약 조건과 일치하도록 올바른 변환, 상속 관계 및 구조적 속성이 있어야 합니다.

  • 형식 인수를 제약 조건 형식(CS0311)으로 암시적 참조 변환이 있는 인수로 변경합니다. 형식 매개 변수에 where T : BaseType와 같은 제약 조건이 있는 경우, 모든 형식 인수는 암시적 참조 변환 또는 항등 변환을 통해 BaseType로 변환될 수 있어야 합니다. 암시적 숫자 형식 변환(예: short에서 int로의 변환)은 제네릭 형식 매개변수 제약 조건을 충족하지 않습니다.
  • nullable이 아닌 값 형식을 사용하거나 제약 조건 형식(CS0312, CS0313)을 변경합니다. Nullable 값 형식(예: int?)은 기본 값 형식과 구별되며 동일한 제약 조건을 충족하지 않습니다. Nullable 래퍼 자체가 인터페이스를 구현하지 않으므로 Nullable 값 형식은 인터페이스 제약 조건을 충족할 수 없습니다. 값 형식의 null을 허용하지 않는 형식을 형식 인수로 사용합니다.
  • 파생 클래스 선언(CS0314)에서 기본 클래스의 형식 매개 변수 제약 조건을 반복합니다. 파생 제네릭 클래스가 제한된 기본 제네릭 클래스에서 상속되는 경우 파생 클래스는 해당 형식 매개 변수에 대해 동일한 제약 조건을 선언해야 합니다.
  • 형식 인수가 참조 형식 또는 클래스 제약 조건(CS0315)을 충족하는지 확인합니다. 형식 매개 변수가 클래스 형식으로 제한되는 경우 제약 조건 관계를 충족하는 boxing 변환이 없으므로 형식 인수로 값 형식(구조체)을 사용할 수 없습니다. 제약 조건을 상속하거나 구현하는 참조 형식을 사용합니다.
  • 제약 조건이 지정될 때 참조 형식을 class 형식 인수로 사용합니다(CS0452). struct 또는 int와 같은 값 형식은 class 제약 조건을 충족할 수 없습니다. 형식 인수를 참조 형식으로 변경하거나 제네릭 형식이 class 값 형식에서 작동할 수 있는 경우 제약 조건을 제거합니다.
  • 제약 조건이 지정될 때 nullable이 아닌 값 형식을 struct 형식 인수로 사용합니다(CS0453). 참조 형식, nullable 값 형식(int?) 및 기타 비값 형식은 제약 조건을 struct 충족할 수 없습니다. null을 허용하지 않는 구체적인 값 형식(예: int, double또는 사용자 정의 struct)을 사용합니다.
  • 제약 조건이 지정될 때 필드가 모두 관리되지 않는 형식인 형식을 unmanaged 사용합니다(CS8377). unmanaged 제약 조건은 모든 중첩 수준에서 모든 필드도 관리되지 않는 형식인, null을 허용하지 않는 값 형식을 요구합니다. 관리되지 않는 것으로 알려져 있지 않은 참조 형식 필드 또는 제네릭 형식 매개 변수가 포함된 형식은 이 제약 조건을 충족하지 않습니다.

자세한 내용은 형식 매개 변수에 대한 제약 조건을 참조하세요.

제약 조건 충돌 및 순환 종속성

  • CS0454: 형식 매개 변수 1 및 형식 매개 변수 2와 관련된 순환 제약 조건 종속성입니다.
  • CS0455: 형식 매개 변수는 충돌하는 제약 조건 'constraint1' 및 'constraint2'를 상속합니다.
  • CS0456: 형식 매개 변수 'type 매개 변수 1'에 'struct' 제약 조건이 있으므로 'type 매개 변수 1'을 'type 매개 변수 2'에 대한 제약 조건으로 사용할 수 없습니다.
  • CS8379: 형식 매개 변수 'type 매개 변수 1'에 '관리되지 않는' 제약 조건이 있으므로 'type 매개 변수 1'을 'type 매개 변수 2'에 대한 제약 조건으로 사용할 수 없습니다.

제약 조건은 순환 종속성을 만들 수 없으며 형식 매개 변수는 동시에 충족할 수 없는 충돌하는 제약 조건을 상속할 수 없습니다. 값 형식 제약 조건(structunmanaged)은 암시적으로 봉인되므로 다른 형식 매개 변수에 대한 제약 조건으로 사용할 수 없습니다.

  • 순환 제약 조건 종속성을 제거합니다(CS0454). 형식 매개 변수는 제약 조건을 통해 직접 또는 간접적으로 자체적으로 의존할 수 없습니다. 예를 들어 where T : U where U : T 순환 종속성을 만듭니다. 제약 조건 중 하나를 제거하여 주기를 중단합니다.
  • 충돌하는 상속된 제약 조건(CS0455)을 제거합니다. C#은 여러 클래스 상속을 지원하지 않으므로 형식 매개 변수를 관련 없는 여러 클래스로 제한할 수 없습니다. 마찬가지로 struct와 클래스 형식 둘 다로 제한할 수 없습니다. 형식 계층 구조를 재구성하거나 충돌하는 제약 조건 중 하나를 제거합니다.
  • 다른 형식 매개 변수의 제약 조건으로 struct-constrained 또는 unmanaged-constrained 형식 매개 변수를 사용하지 마세요(CS0456, CS8379). 값 형식 제약 조건은 암시적으로 봉인되므로 다른 형식에서 파생될 수 없습니다. 이 오류를 해결하려면 첫 번째 형식 매개 변수를 통해 간접적으로 제한하는 대신 값 형식 또는 관리되지 않는 제약 조건을 두 번째 형식 매개 변수에 직접 배치합니다.

자세한 내용은 형식 매개 변수에 대한 제약 조건을 참조하세요.

재정의 및 구현 제약 조건 규칙

  • CS8665: 'method' 메서드는 형식 매개 변수 'type 매개 변수'에 대해 'class' 제약 조건을 지정하지만 재정의되거나 명시적으로 구현된 메서드 'method'의 해당 형식 매개 변수 'type 매개 변수'는 참조 형식이 아닙니다.
  • CS8666: 'method' 메서드는 형식 매개 변수 'type 매개 변수'에 대해 'struct' 제약 조건을 지정하지만 재정의되거나 명시적으로 구현된 메서드 'method'의 해당 형식 매개 변수 'type 매개 변수'는 null을 허용하지 않는 값 형식이 아닙니다.
  • CS8822: 'method' 메서드는 형식 매개 변수 'type 매개 변수'에 대한 'default' 제약 조건을 지정하지만 재정의되거나 명시적으로 구현된 메서드 'method'의 해당 형식 매개 변수 'type 매개 변수'는 참조 형식 또는 값 형식으로 제한됩니다.
  • CS8823: 'default' 제약 조건은 재정의 및 명시적 인터페이스 구현 메서드에만 유효합니다.

가상 메서드를 재정의하거나 인터페이스 메서드를 명시적으로 구현하는 경우 재정의 메서드의 형식 매개 변수에 대한 제약 조건은 기본 메서드의 제약 조건과 호환되어야 합니다. default 제약 조건은 형식 매개 변수에 class 제약 조건도 struct 제약 조건도 없음을 나타내기 위해 재정의 및 명시적 인터페이스 구현 경우에만 사용되는 특수 한정자입니다.

  • 재정의 메서드의 제약 조건이 기본 메서드의 제약 조건(CS8665, CS8666)과 일치하는지 확인합니다. 기본 메서드의 해당 형식 매개 변수가 참조 형식으로 class 제한되지 않으면 재정의에서 제약 조건을 추가할 수 없습니다. 마찬가지로 기본 메서드의 형식 매개 변수가 값 형식으로 struct 제한되지 않으면 제약 조건을 추가할 수 없습니다. 재정의는 기본 선언과 호환되어야 합니다.
  • default 기본 메서드의 형식 매개 변수가 제한되지 않은 경우에만 제약 조건을 사용합니다(CS8822). default 제약 조건은 형식 매개 변수에 class 또는 struct 제약 조건이 없음을 나타냅니다. 재정의된 메서드의 해당 형식 매개 변수에 이미 class 또는 struct 제약 조건이 있는 경우 default를 적용할 수 없습니다.
  • default 제약 조건은 재정의 메서드 또는 명시적 인터페이스 구현 메서드에서만 사용합니다(CS8823). 이 제약 조건은 default 일반 메서드 선언에서 유효하지 않습니다. 특히 기본에 제약이 없는 형식 매개 변수가 있는 메서드를 재정의할 때 명확하게 하기 위해 존재하며, 재정의에서도 제한되지 않음을 나타내야 합니다.

자세한 내용은 형식 매개 변수 및 제약 조건에 대한제약 조건을default 참조하세요.

생성자 제약 조건

  • CS0304: 제약 조건이 없으므로 변수 형식의 인스턴스를 new() 만들 수 없습니다.
  • CS0310: 형식을 제네릭 형식 또는 메서드의 매개 변수로 사용하려면 공용 매개 변수가 없는 생성자가 있는 비 추상 형식이어야 합니다.
  • CS0417: 식별자: 변수 형식의 인스턴스를 만들 때 인수를 제공할 수 없습니다.

이러한 오류는 제약 조건 new() 과 연산자를 사용하여 형식 매개 변수 new 를 인스턴스화하는 것과 관련이 있습니다.

  • new() 인스턴스화해야 하는 형식 매개 변수에 제약 조건을 추가합니다(CS0304). 제네릭 형식 또는 메서드 내에서 사용하는 new T() 경우 컴파일러는 모든 형식 인수에 매개 변수가 없는 생성자가 있는지 확인해야 합니다. 제약 조건은 new() 이 보증을 제공합니다.
  • 형식 인수에 공용 매개 변수 없는 생성자(CS0310)가 있는지 확인합니다. 형식 매개 변수에 제약 조건이 new() 있는 경우 형식 인수로 사용되는 구체적인 형식은 비 추상 형식이어야 하며 공용 매개 변수가 없는 생성자를 제공해야 합니다. 프라이빗, 보호 또는 매개 변수가 있는 생성자만 있는 형식은 제약 조건을 new() 충족할 수 없습니다.
  • 형식 매개 변수를 인스턴스화할 때 생성자 인수를 제거합니다(CS0417). 제약 조건은 new() 매개 변수가 없는 생성자만 보장합니다. new T(arguments)에 인수를 전달할 수 없습니다. 특정 인수를 사용하여 인스턴스를 생성해야 하는 경우 팩터리 패턴 또는 생성 동작을 정의하는 인터페이스 제약 조건을 사용하는 것이 좋습니다.

자세한 내용은 형식 매개 변수 및 제약 조건에 대한제약 조건을new() 참조하세요.

형식 인수 수 및 사용량

  • CS0224: vararg를 사용하는 메서드는 제네릭이거나 제네릭 형식이거나 매개 변수가 있을 수 없습니다.
  • CS0305: 제네릭 형식을 사용하려면 N 형식 인수가 필요합니다.
  • CS0306: 형식을 형식 인수로 사용할 수 없습니다.
  • CS0307: 'identifier'는 형식 인수와 함께 사용할 수 없습니다.
  • CS0308: 제네릭이 아닌 형식 또는 메서드는 형식 인수와 함께 사용할 수 없습니다.
  • CS7002: 제네릭 이름을 예기치 않게 사용했습니다.
  • CS8389: 현재 컨텍스트에서는 형식 인수를 생략할 수 없습니다.

이러한 오류는 제네릭 형식 및 메서드에 올바른 수와 형식의 인수를 제공하는 것과 관련이 있습니다.

  • __arglist를 사용하는 메서드(CS0224)에서 제네릭 형식 매개 변수 또는 포함된 제네릭 형식 선언을 제거합니다. __arglist 변수 인수 목록을 처리하기 위한 런타임 메커니즘이 제네릭 형식 매개 변수에 필요한 형식 대체와 충돌하기 때문에 키워드는 제네릭과 호환되지 않습니다.
  • 제네릭 선언(CS0305)에 지정된 정확한 형식 인수 수를 제공합니다. 제네릭 형식이 인스턴스화될 때 정의의 각 제네릭 형식 매개 변수에는 해당 형식 인수가 있어야 합니다.
  • 형식 인수로 유효한 형식만 사용합니다(CS0306). 제네릭 형식에는 가비지 수집기에서 추적할 수 있는 관리되는 형식이 필요하기 때문에 포인터 형식(예: int* 또는 char*)을 형식 인수로 사용할 수 없습니다.
  • 제네릭이 아닌 구문(CS0307, CS0308)에서 형식 인수 구문을 제거합니다. 꺾쇠 괄호로 묶인 형식 인수는 형식 매개 변수를 선언하는 제네릭 형식 및 메서드에만 적용할 수 있습니다. 해당 형식의 제네릭 버전이 포함된 네임스페이스를 가져왔는지 확인하세요.
  • 제네릭을 지원하지 않는 선언에서 형식 매개 변수를 제거합니다(CS7002). 열거형과 같은 일부 구문은 제네릭일 수 없습니다. 열거형 값에 제네릭 컨테이너가 필요한 경우 제네릭 클래스 또는 구조체를 대신 사용하는 것이 좋습니다.
  • 모든 필수 형식 인수를 명시적으로 제공합니다(CS8389). 연산자 사용 typeof 또는 대리자 만들기와 같은 일부 컨텍스트에서는 모든 형식 인수를 제공해야 하며 생략할 수 없습니다. 예를 들어 형식 인수를 생략하는 대신 사용합니다 typeof(List<int>) .

자세한 내용은 제네릭 형식 매개 변수제네릭을 참조하세요.

타입 인수 추론

  • CS0411: 메서드 'method'의 형식 인수는 사용법에서 유추할 수 없습니다. 형식 인수를 명시적으로 지정해 보세요.

이 오류는 형식 인수를 명시적으로 제공하지 않고 제네릭 메서드를 호출할 때 발생하며 컴파일러는 원하는 형식 인수를 유추할 수 없습니다. 컴파일러는 호출 사이트에서 전달하는 메서드 인수의 형식에서 형식 인수를 유추합니다.

  • 형식 인수를 꺾쇠 괄호(CS0411)로 명시적으로 지정합니다. 컴파일러가 메서드 인수에서 형식 인수를 확인할 수 없는 경우 직접 제공합니다. 예를 들어 G()G<int>()로 변경합니다. 이 오류는 일반적으로 제네릭 메서드에 형식을 유추할 매개 변수가 없거나 인수가 전달되고 컴파일러가 의도한 형식을 확인할 수 없는 경우에 null 발생합니다.

자세한 내용은 제네릭 메서드를 참조하세요.

타입 매개 변수 분산

  • CS1960: 잘못된 분산 한정자입니다. 인터페이스 및 대리자 형식 매개 변수만 variant로 지정할 수 있습니다.
  • CS1961: 잘못된 분산: 형식 매개 변수는 'type'에서 공변적으로 유효해야 합니다. 'type 매개 변수'는 반공변입니다.
  • CS8427: 열거형, 클래스 및 구조체는 'in' 또는 'out' 형식 매개 변수가 있는 인터페이스에서 선언할 수 없습니다.

가변성 한정자(in 반공변성, out 공변성)는 인터페이스 및 대리자 선언에서 형식 매개 변수를 사용하는 방법을 제어합니다. 인터페이스 및 대리자만 분산을 지원합니다. 공변(out) 형식 매개 변수는 출력 위치(반환 형식)에만 나타날 수 있지만 반공변(in) 형식 매개 변수는 입력 위치(매개 변수 형식)에만 나타날 수 있습니다.

  • 인터페이스 및 대리자 형식 매개 변수(CS1960)에서만 분산 한정자를 사용합니다. 클래스, 구조체 및 기타 형식 선언은 분산 한정자를 지원하지 않습니다. interfacedelegate 선언만 해당 형식 매개 변수에 in 또는 out를 사용할 수 있습니다.
  • 반환 형식에만 나타나는 형식 매개 변수에는 out(공변)를 사용하고, 매개 변수 형식에만 나타나는 형식 매개 변수에는 in(반공변)를 사용합니다(CS1961). 형식 매개 변수가 입력 및 출력 위치 모두에 나타나야 하는 경우 분산 한정자를 제거합니다.
  • 변형 인터페이스(CS8427) 내에서 열거형, 클래스 또는 구조를 선언하지 마세요. in 또는 out 형식 매개 변수가 있는 인터페이스 내부의 중첩 형식 선언은 분산 안전 규칙을 위반할 수 있으므로 허용되지 않습니다. 중첩된 형식을 인터페이스 선언 외부로 이동합니다.

자세한 내용은 제네릭의 공변성 및 반공변성(Contravariance)을 참조하세요.

제네릭 형식 사용 제한

  • CS0403: null이 아닌 값 형식일 수 있으므로 null을 형식 매개 변수로 변환할 수 없습니다. 대신 사용하는 default(T) 것이 좋습니다.
  • CS0413: 형식 매개 변수를 as 연산자와 함께 사용할 수 없습니다. 이는 해당 형식 매개 변수가 클래스 형식 제약 조건이나 class 제약 조건이 없기 때문입니다.
  • CS0695: 'type'은 일부 형식 매개 변수 대체에 대해 통합될 수 있으므로 'interface1' 및 'interface2'를 모두 구현할 수 없습니다.
  • CS0698: 제네릭 형식은 특성 클래스이므로 형식에서 파생될 수 없습니다.
  • CS0704: 형식 매개 변수이므로 'type'에서 가상 멤버가 아닌 멤버 조회를 수행할 수 없습니다.
  • CS0718: 'type': 정적 형식은 형식 인수로 사용할 수 없습니다.
  • CS1720: 식은 '제네릭 형식'의 기본값이 null이므로 항상 System.NullReferenceException을 발생합니다.
  • CS1763: 'parameter'는 'type' 형식입니다. 문자열 이외의 참조 형식의 기본 매개 변수 값은 null로만 초기화할 수 있습니다.
  • CS8322: 동적 형식의 인수를 유추된 형식 인수를 사용하여 제네릭 로컬 함수에 전달할 수 없습니다.
  • CS9338: 일관성 없는 접근성: 형식은 클래스보다 접근성이 떨어집니다.

이러한 오류는 식, 상속 및 멤버 액세스에서 제네릭 형식 및 형식 매개 변수를 사용할 수 있는 방법에 대한 제한 사항과 관련이 있습니다.

  • null 할당을 default(T)로 교체하거나 class 제약 조건을 추가하십시오(CS0403). 제약이 없는 형식 매개 변수에 할당 null 하는 경우 컴파일러는 형식 인수가 참조 형식임을 보장할 수 없습니다. 모든 형식에 대해 적절한 기본값을 제공하는 default(T)를 사용하거나, 참조 형식 의미 체계가 특별히 필요한 경우 class 제약 조건을 추가하세요.
  • class 연산자를 사용할 때 as 또는 특정 형식 제약 조건을 추가하십시오(CS0413). as 연산자는 변환이 실패하면 null을 반환하지만, 값 형식은 null일 수 없습니다. 제약 조건을 class 추가하여 형식 매개 변수가 항상 참조 형식인지 확인합니다.
  • 통합할 수 있는 형식 매개 변수를 사용하여 동일한 제네릭 인터페이스를 여러 번 구현하지 마세요(CS0695). 클래스가 서로 다른 형식 매개 변수(예: )를 class G<T1, T2> : I<T1>, I<T2>사용하여 제네릭 인터페이스를 여러 번 구현하는 경우 두 매개 변수에 대해 동일한 형식으로 인스턴스화하면 충돌이 발생합니다. 인터페이스를 한 번만 구현하거나 통합을 방지하기 위해 재구성합니다.
  • 특성 클래스에서 제네릭 형식 매개 변수를 제거합니다(CS0698). 제네릭 특성이 지원되므로 이 오류는 현재 버전의 C#에서 더 이상 생성되지 않습니다.
  • 중첩 멤버 액세스(CS0704)에 대한 형식 매개 변수 대신 구체적인 제약 조건 형식을 사용합니다. 형식 매개 변수를 통해 중첩된 형식 또는 가상이 아닌 멤버에 액세스할 수 없습니다. T.InnerType 대신 BaseClass.InnerType와 같은 알려진 제약 조건 유형을 직접 사용합니다.
  • 정적 형식을 형식 인수로 사용하지 마세요(CS0718). 정적 형식은 인스턴스화할 수 없으며 제네릭 인수로 사용할 수 없습니다. 제네릭 인수에서 정적 형식을 제거합니다.
  • 참조 형식(default(T))으로 제한되는 경우 T 인스턴스 멤버 를 호출하지 마세요. Tclass 제약 조건이 있으면 default(T)null입니다. 따라서 이 항목에서 인스턴스 멤버를 호출하면 항상 NullReferenceException 예외가 발생합니다. 멤버를 호출하기 전에 null 검사를 추가하거나 직접 사용하지 default(T) 않도록 코드를 재구성합니다.
  • 형식이 참조 형식(null)인 선택적 매개 변수의 기본 매개 변수 값으로 사용합니다. 제네릭 메서드에 T 형식의 매개 변수가 있고 T이 참조 형식인 경우, default(U)null로 바꾸세요. 선택적 매개 변수의 기본값은 컴파일 시간 상수여야 하며, default(T)로도 그 요구 사항은 충족되지 않기 때문입니다.
  • 동적 값을 제네릭 로컬 함수(CS8322)에 전달할 때 형식 인수를 명시적으로 지정합니다. 제네릭 로컬 함수에 인수를 전달하는 dynamic 경우 컴파일러는 형식 인수를 유추할 수 없습니다. 형식 인수를 명시적으로 지정하거나 동적 값을 캐스팅합니다.
  • 공용 또는 보호된 서명에 사용되는 형식 인수가 최소한 멤버(CS9338)만큼 액세스할 수 있는지 확인합니다. 공용 제네릭 멤버는 공개적으로 액세스할 수 있는 형식 인수를 사용해야 합니다. 형식 인수를 공용으로 만들거나 멤버의 접근성을 줄입니다.

자세한 내용은 형식 매개 변수 및 기본값 식에 대한 제약 조건을 참조하세요.

UnmanagedCallersOnly 제한 사항

  • CS8893: 'type'은 'UnmanagedCallersOnly'에 유효한 호출 규칙 형식이 아닙니다.
  • CS8894: 'UnmanagedCallersOnly'로 특성이 지정된 메서드에서 'type'을 매개 변수 또는 반환 형식으로 사용할 수 없습니다.
  • CS8895: 'UnmanagedCallersOnly'로 특성이 지정된 메서드는 제네릭 형식 매개 변수를 가질 수 없으며 제네릭 형식으로 선언할 수 없습니다.
  • CS8896: 'UnmanagedCallersOnly'는 일반 정적 비추상, 비 가상 메서드 또는 정적 로컬 함수에만 적용할 수 있습니다.

이 특성은 UnmanagedCallersOnlyAttribute 관리되지 않는 코드가 호출할 수 있는 메서드를 표시합니다. 런타임이 관리되는 호출 규칙과 관리되지 않는 호출 규칙 간의 전환을 처리해야 하므로 이러한 메서드에는 엄격한 요구 사항이 있습니다.

  • 특성에서 UnmanagedCallersOnly 유효한 호출 규칙 형식만 사용합니다(CS8893). 특성의 속성은 CallConvs 네임스페이스에서 인식된 호출 규칙 형식 System.Runtime.CompilerServices 만 허용합니다.
  • blittable 형식만 매개 변수 및 반환 형식으로 사용합니다(CS8894). UnmanagedCallersOnly로 표시된 메서드는 비관리 호출자가 가비지 수집되는 참조를 관리할 수 없으므로 관리되는 형식(예: string 또는 object)을 매개 변수 형식이나 반환 형식으로 사용할 수 없습니다.
  • 메서드에서 UnmanagedCallersOnly 제네릭 형식 매개 변수를 제거하고 제네릭 형식으로 선언하지 마세요(CS8895). 관리되지 않는 호출 규칙은 제네릭 형식 대체에 대한 올바른 호출 규칙을 런타임에서 확인할 수 없기 때문에 제네릭을 지원하지 않습니다.
  • UnmanagedCallersOnly은 일반 정적, 비추상, 비가상 메서드 또는 정적 로컬 함수에만 적용하세요. (CS8896) 관리되지 않는 호출자는 이러한 메서드에 필요한 디스패치 메커니즘을 UnmanagedCallersOnly 수행할 수 없으므로 인스턴스 메서드, 추상 메서드 및 가상 메서드를 표시할 수 없습니다.

자세한 내용은 UnmanagedCallersOnlyAttribute를 참조하세요.