생성자 선언에서 오류 및 경고 해결
이 문서에서는 다음과 같은 컴파일러 오류를 다룹니다.
- CS0514: 정적 생성자에는 명시적 'this' 또는 'base' 생성자 호출을 사용할 수 없습니다.
- CS0515: 정적 생성자에서는 액세스 한정자를 사용할 수 없습니다.
- CS0516: 'constructor' 생성자는 자신을 호출할 수 없습니다.
- CS0517: 'class'에는 기본 클래스가 없으므로 기본 생성자를 호출할 수 없습니다.
- CS0522: 구조체는 기본 클래스 생성자를 호출할 수 없습니다.
- CS0526: 인터페이스는 생성자를 포함할 수 없습니다.
- CS0568: 구조체는 매개 변수가 없는 명시적 생성자를 포함할 수 없습니다.
- CS0710: 정적 클래스는 인스턴스 생성자를 포함할 수 없습니다.
- CS0768: 생성자는 다른 생성자를 통해 자신을 호출할 수 없습니다.
- CS8054: 열거형은 명시적인 매개 변수가 없는 생성자를 포함할 수 없습니다.
- CS8091: extern일 수 없으며 생성자 이니셜라이저를 사용할 수 없습니다.
- CS8861: 예기치 않은 인수 목록입니다.
- CS8862: 매개 변수 목록이 있는 형식에서 선언된 생성자에는 'this' 생성자 이니셜라이저가 있어야 합니다.
- CS8358: 'in' 매개 변수가 있으므로 특성 생성자를 사용할 수 없습니다.
- CS8867: 기본 형식 '{0}'에서 액세스할 수 있는 복사 생성자를 찾을 수 없습니다.
- CS8868: 레코드의 복사 생성자는 기본의 복사 생성자 또는 레코드가 개체에서 상속되는 경우 매개 변수가 없는 개체 생성자를 호출해야 합니다.
- CS8878: 레코드가 봉인되지 않았으므로 복사 생성자 '{0}'이(가) 공용이거나 보호되어야 합니다.
- CS8910: 기본 생성자가 합성된 복사 생성자와 충돌합니다.
- CS8958: 매개 변수가 없는 구조체 생성자는 'public'이어야 합니다.
- CS8982: 매개 변수 목록이 있는 '구조체'에 선언된 생성자에는 기본 생성자 또는 명시적으로 선언된 생성자를 호출하는 'this' 이니셜라이저가 있어야 합니다.
- CS8983: 필드 이니셜라이저가 있는 '구조체'에는 명시적으로 선언된 생성자가 포함되어야 합니다.
- CS9105: 이 컨텍스트에서 기본 생성자 매개 변수를 사용할 수 없습니다.
- CS9106: 식별자는 이 컨텍스트에서 형식과 매개 변수 간에 모호합니다. 클래스도 마찬가지입니다.*
- CS9108: 익명 메서드, 람다 식, 쿼리 식 또는 로컬 함수 내에 ref와 유사한 형식이 있는 매개 변수를 사용할 수 없습니다.
- CS9109: 인스턴스 멤버 내에서
ref
,out
또는in
기본 생성자 매개 변수를 사용할 수 없습니다. - CS9110: 인스턴스 멤버 내에 ref와 유사한 형식이 있는 기본 생성자 매개 변수를 사용할 수 없습니다.
- CS9111: 구조체의 인스턴스 멤버 내 익명 메서드, 람다 식, 쿼리 식 및 로컬 함수는 기본 생성자 매개 변수에 액세스할 수 없습니다.
- CS9112: 구조체 내의 익명 메서드, 람다 식, 쿼리 식 및 로컬 함수는 인스턴스 멤버 내에서도 사용되는 기본 생성자 매개 변수에 액세스할 수 없습니다.
- CS9114: 읽기 전용 형식의 기본 생성자 매개 변수는 할당할 수 없습니다(형식의 init 전용 setter 또는 변수 이니셜라이저 제외).
- CS9115: 읽기 전용 형식의 기본 생성자 매개 변수는 쓰기 가능한 참조로 반환할 수 없습니다.
- CS9116: 읽기 전용 형식의 기본 생성자 매개 변수는 ref 또는 out 값으로 사용할 수 없습니다(형식의 init 전용 setter 또는 변수 이니셜라이저 제외).
- CS9117: 읽기 전용 형식의 기본 생성자 매개 변수의 멤버는 수정할 수 없습니다(형식의 init 전용 setter 또는 변수 이니셜라이저 제외).
- CS9118: 읽기 전용 형식의 기본 생성자 매개 변수의 멤버는 쓰기 가능 참조로 반환할 수 없습니다.
- CS9119: 읽기 전용 형식의 기본 생성자 매개 변수 멤버는
ref
또는out
값으로 사용할 수 없습니다(형식 또는 변수 이니셜라이저의 init 전용 setter 제외). - CS9120: 참조로 기본 생성자 매개 변수를 반환할 수 없습니다.
- CS9121: 형식의 구조체 기본 생성자 매개 변수로 인해 구조체 레이아웃의 주기가 발생합니다.
- CS9122: 예기치 않은 매개 변수 목록입니다.
- CS9136: 인스턴스 멤버 내에서 형식의 기본 생성자 매개 변수를 사용할 수 없습니다.
또한 이 문서에서는 다음 경고를 다룹니다.
- CS0824: 'name' 생성자가 external로 표시되었습니다.
- CS9107: 매개 변수가 바깥쪽 형식의 상태로 캡처되고 해당 값도 기본 생성자에 전달됩니다. 기본 클래스에서도 값을 캡처할 수 있습니다.
- CS9113: 매개 변수를 읽지 않았습니다.
- CS9124: 매개 변수는 바깥쪽 형식의 상태로 캡처되며 해당 값은 필드, 속성 또는 이벤트를 초기화하는 데도 사용됩니다.
- CS9179: 기본 생성자 매개 변수가 기본 생성자 매개 변수의 멤버에 의해 숨기게 됩니다.
정적 생성자
- CS0514: 정적 생성자에는 명시적 'this' 또는 'base' 생성자 호출을 사용할 수 없습니다.
- CS0515: 정적 생성자에서는 액세스 한정자를 사용할 수 없습니다.
형식에 대해 최대 하나의 정적 생성자를 작성할 수 있습니다. 정적 생성자의 선언은 다음 규칙을 준수해야 합니다.
- 정적 생성자에는
static
한정자가 있지만public
,protected
,private
,internal
와(과) 같은 다른 한정자는 없습니다. - 정적 생성자는 매개 변수가 없는 생성자여야 합니다.
- 정적 생성자는
base()
또는this()
을(를) 호출해서는 안 됩니다. 기본 클래스에 정적 생성자가 포함되어 있으면 런타임에서 자동으로 호출합니다.
생성자 선언
- CS0526: 인터페이스는 생성자를 포함할 수 없습니다.
- CS0710: 정적 클래스는 인스턴스 생성자를 포함할 수 없습니다.
- CS8054: 열거형은 명시적인 매개 변수가 없는 생성자를 포함할 수 없습니다.
- CS8358: 'in' 매개 변수가 있으므로 특성 생성자를 사용할 수 없습니다.
- CS8091: 생성자는 extern일 수 없으며 생성자 이니셜라이저를 가질 수 없습니다.
생성자는 record class
및 record struct
형식을 포함하여 class
및 struct
형식에서만 허용됩니다. enum
형식 또는 interface
형식으로 정의할 수 없습니다. 또한 특성 클래스 형식은 in
매개 변수를 선언할 수 없습니다. 대신 값으로 매개 변수를 전달합니다.
extern
생성자를 선언할 수 있지만 base()
또는 this()
생성자 호출을 사용하여 extern
로 선언된 생성자에서 다른 생성자를 호출할 수는 없습니다.
또한 생성자 선언에 대해 다음 경고를 생성할 수 있습니다.
- CS0824: 생성자가 external로 표시되었습니다.
생성자가 extern
(으)로 표시되면 컴파일러는 생성자가 존재할 수 없습니다. 따라서 컴파일러는 이 경고를 생성합니다.
구조체 형식의 생성자
- CS0568: 구조체는 매개 변수가 없는 명시적 생성자를 포함할 수 없습니다.
- CS8958: 매개 변수가 없는 구조체 생성자는 'public'이어야 합니다.
- CS8982: 매개 변수 목록이 있는 '구조체'에 선언된 생성자에는 기본 생성자 또는 명시적으로 선언된 생성자를 호출하는 'this' 이니셜라이저가 있어야 합니다.
- CS8983: 필드 이니셜라이저가 있는 '구조체'에는 명시적으로 선언된 생성자가 포함되어야 합니다.
C#의 최근 기능은 struct
형식에 대한 이전 제한을 제거합니다. CS0568은 이전 버전의 C#에서 매개 변수가 없는 인스턴스 생성자를 선언할 때 생성됩니다. C# 10을 사용하면 명시적 매개 변수가 없는 인스턴스 생성자를 선언할 수 있습니다. 명시적 매개 변수가 없는 생성자는 public
이어야 합니다. struct
이(가) 필드 이니셜라이저를 선언하는 경우 명시적 인스턴스 생성자도 선언해야 합니다. 이 생성자는 빈 본문이 있는 매개 변수가 없는 생성자일 수 있습니다.
struct
형식이 record struct
형식을 포함하여 기본 생성자를 선언하는 경우 매개 변수가 없는 생성자를 제외한 다른 모든 인스턴스 생성자는 this()
을(를) 사용하여 기본 생성자 또는 명시적으로 선언된 다른 생성자를 호출해야 합니다.
생성자가 base
및 this
을(를) 사용하여 호출합니다.
- CS0516: 생성자가 자신을 호출할 수 없습니다.
- CS0517: 'class'에는 기본 클래스가 없으므로 기본 생성자를 호출할 수 없습니다.
- CS0522: 구조체는 기본 클래스 생성자를 호출할 수 없습니다.
- CS0768: 생성자는 다른 생성자를 통해 자신을 호출할 수 없습니다.
base()
및 this()
을(를) 사용하여 한 생성자가 동일한 형식 또는 기본 형식에서 다른 생성자를 호출하도록 할 수 있습니다. 호출 생성자는 중복된 생성자 논리를 최소화할 수 있습니다. this()
또는 base()
을(를) 사용하여 다른 생성자를 호출할 때 다음 규칙을 따라야 합니다.
생성자는 다른 생성자를 통해 직접 또는 간접적으로 자신을 호출할 수 없습니다. 예를 들어 다음 코드는 잘못되었습니다.
public class C { public C() : this() // Error! { } } public class C2 { public class C2() : this(10) {} public class C2(int capacity) : this() { _capacity = capacity; } private int _capacity; } ``
구조체 형식은
base()
을(를) 호출할 수 없습니다. 어느 쪽도 System.Object할 수 없습니다.
레코드 및 복사 생성자
- CS8867: 기본 형식에서 액세스할 수 있는 복사 생성자를 찾을 수 없습니다.
- CS8868: 레코드의 복사 생성자는 기본의 복사 생성자 또는 레코드가 개체에서 상속되는 경우 매개 변수가 없는 개체 생성자를 호출해야 합니다.
- CS8878: 레코드가 봉인되지 않았으므로 복사 생성자는 공용이거나 보호되어야 합니다.
- CS8910: 기본 생성자가 합성된 복사 생성자와 충돌합니다.
record
한정자를 struct
또는 class
형식에 추가하면 레코드가 만들어집니다. 레코드에는 컴파일러 합성 복사 생성자가 포함됩니다. 명시적 복사 생성자를 직접 작성할 수 있지만 다음 규칙을 준수해야 합니다.
- 형식이
sealed
이(가) 아닌 한 복사 생성자는public
또는protected
이어야 합니다. - 기본 클래스가 System.Object이(가) 아닌 한 복사 생성자는
base()
복사 생성자를 호출해야 합니다. - 또한 기본 형식에는 복사 생성자가 있어야 합니다.
record
형식에는 항상 복사 생성자가 있습니다.
기본 생성자 선언
컴파일러는 기본 생성자가 클래스 및 구조체에 대한 기본 생성자에 대한 하나 이상의 규칙을 위반하는 경우 다음 오류를 내보낸다.
- CS8861: 예기치 않은 인수 목록입니다.
- CS8862: 매개 변수 목록이 있는 형식에서 선언된 생성자에는 'this' 생성자 이니셜라이저가 있어야 합니다.
- CS9105: 이 컨텍스트에서 기본 생성자 매개 변수를 사용할 수 없습니다.
- CS9106: 식별자는 이 컨텍스트에서 형식과 매개 변수 간에 모호합니다.
- CS9108: 익명 메서드, 람다 식, 쿼리 식 또는 로컬 함수 내에 ref와 유사한 형식이 있는 매개 변수를 사용할 수 없습니다.
- CS9109: 인스턴스 멤버 내에서
ref
,out
또는in
기본 생성자 매개 변수를 사용할 수 없습니다. - CS9110: 인스턴스 멤버 내에 ref와 유사한 형식이 있는 기본 생성자 매개 변수를 사용할 수 없습니다.
- CS9111: 구조체의 인스턴스 멤버 내 익명 메서드, 람다 식, 쿼리 식 및 로컬 함수는 기본 생성자 매개 변수에 액세스할 수 없습니다.
- CS9112: 구조체 내의 익명 메서드, 람다 식, 쿼리 식 및 로컬 함수는 인스턴스 멤버 내에서도 사용되는 기본 생성자 매개 변수에 액세스할 수 없습니다.
- CS9114: 읽기 전용 형식의 기본 생성자 매개 변수는 할당할 수 없습니다(형식의 init 전용 setter 또는 변수 이니셜라이저 제외).
- CS9115: 읽기 전용 형식의 기본 생성자 매개 변수는 쓰기 가능한 참조로 반환할 수 없습니다.
- CS9116: 읽기 전용 형식의 기본 생성자 매개 변수는
ref
또는out
값으로 사용할 수 없습니다(형식의 init 전용 setter 또는 변수 이니셜라이저 제외). - CS9117: 읽기 전용 형식의 기본 생성자 매개 변수의 멤버는 수정할 수 없습니다(형식의 init 전용 setter 또는 변수 이니셜라이저 제외).
- CS9118: 읽기 전용 형식의 기본 생성자 매개 변수의 멤버는 쓰기 가능 참조로 반환할 수 없습니다.
- CS9119: 읽기 전용 형식의 기본 생성자 매개 변수 멤버는
ref
또는out
값으로 사용할 수 없습니다(형식 또는 변수 이니셜라이저의 init 전용 setter 제외). - CS9120: 참조로 기본 생성자 매개 변수를 반환할 수 없습니다.
- CS9121: 형식의 구조체 기본 생성자 매개 변수로 인해 구조체 레이아웃의 주기가 발생합니다.
- CS9122: 예기치 않은 매개 변수 목록입니다.
- CS9124: 매개 변수는 바깥쪽 형식의 상태로 캡처되며 해당 값은 필드, 속성 또는 이벤트를 초기화하는 데도 사용됩니다.
- CS9136: 인스턴스 멤버 내에서 형식의 기본 생성자 매개 변수를 사용할 수 없습니다.
기본 생성자 매개 변수는 해당 형식의 본문 범위에 있습니다. 컴파일러는 멤버 또는 필드 이니셜라이저에 사용할 매개 변수를 저장하는 필드를 합성할 수 있습니다. 기본 생성자 매개 변수를 필드에 복사할 수 있으므로 다음 제한 사항이 적용됩니다.
- 기본 생성자는
struct
및class
형식에서 선언할 수 있지만interface
형식에서는 선언할 수 없습니다. - 기본 생성자 매개 변수는 주 생성자의 일부를 제외하고
base()
생성자 호출에서 사용할 수 없습니다. ref struct
형식의 기본 생성자 매개 변수는 람다 식, 쿼리 식 또는 로컬 함수에서 액세스할 수 없습니다.- 형식이
ref struct
이(가) 아닌 경우 인스턴스 멤버에서ref struct
매개 변수에 액세스할 수 없습니다. ref struct
형식에서in
,ref
또는out
한정자가 있는 기본 생성자 매개 변수는 인스턴스 메서드 또는 속성 접근자에서 사용할 수 없습니다.
구조체 형식에는 기본 생성자 매개 변수에 대해 다음과 같은 추가 제한이 있습니다.
- 기본 생성자 매개 변수는 람다 식, 쿼리 식 또는 로컬 함수에서 캡처할 수 없습니다.
- 기본 생성자 매개 변수는 참조(
ref
반환 또는readonly ref
반환)로 반환할 수 없습니다.
읽기 전용 구조체 형식에는 기본 생성자 매개 변수에 대해 다음과 같은 추가 제한이 있습니다.
- 기본 생성자 매개 변수 및 해당 멤버는
readonly
구조체에서 다시 할당할 수 없습니다. - 기본 생성자 매개 변수와 해당 멤버는
readonly
구조체에서 반환되는ref
일 수 없습니다. - 기본 생성자 매개 변수와 해당 멤버는 메서드에 대한
ref
또는out
인수가 될 수 없습니다.
이러한 모든 경우에서 기본 생성자 매개 변수에 대한 제한은 해당 형식의 데이터 필드에 대한 제한 사항과 일치합니다. 제한 사항은 기본 생성자 매개 변수가 형식의 합성 필드로 변환될 수 있기 때문입니다. 따라서 기본 생성자 매개 변수는 합성된 필드에 적용되는 규칙을 따라야 합니다.
파생된 기본 생성자는 기본 생성자에 매개 변수를 제공하여 베이스 기본 생성자를 호출합니다. 파생 생성자 선언에서 매개 변수 이름을 사용해야 합니다.
경고는 캡처되거나 그림자가 지정된 기본 생성자 매개 변수에 대한 지침을 제공합니다.
- CS9107: 매개 변수가 바깥쪽 형식의 상태로 캡처되고 해당 값도 기본 생성자에 전달됩니다. 기본 클래스에서도 값을 캡처할 수 있습니다. 이 경고는 코드에 주 생성자 매개 변수의 복사본 두 개가 할당될 수 있음을 나타냅니다. 매개 변수가 기본 클래스에 전달되므로 기본 클래스에서 매개 변수를 사용할 가능성이 높습니다. 파생 클래스가 액세스하므로 동일한 매개 변수의 두 번째 복사본이 있을 수 있습니다. 해당 추가 스토리지는 의도되지 않을 수 있습니다.
- CS9113: 매개 변수를 읽지 않았습니다. 이 경고는 기본 생성자에 전달하더라도 클래스가 기본 생성자를 참조하지 않는다는 것을 나타냅니다. 필요하지 않을 수 있습니다.
- CS9124: 매개 변수는 바깥쪽 형식의 상태로 캡처되며 해당 값은 필드, 속성 또는 이벤트를 초기화하는 데도 사용됩니다. 이 경고는 중첩 형식의 생성자 매개 변수도 바깥쪽 형식에 의해 캡처됨을 나타냅니다. 매개 변수는 두 번 저장될 가능성이 높습니다.
- CS9179: 기본 생성자 매개 변수가 베이스의 멤버에 의해 섀도 처리됩니다.
.NET
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기