생성자 선언에서 오류 및 경고 해결

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

  • 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 classrecord struct 형식을 포함하여 classstruct 형식에서만 허용됩니다. 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()을(를) 사용하여 기본 생성자 또는 명시적으로 선언된 다른 생성자를 호출해야 합니다.

생성자가 basethis을(를) 사용하여 호출합니다.

  • 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: 인스턴스 멤버 내에서 형식의 기본 생성자 매개 변수를 사용할 수 없습니다.

기본 생성자 매개 변수는 해당 형식의 본문 범위에 있습니다. 컴파일러는 멤버 또는 필드 이니셜라이저에 사용할 매개 변수를 저장하는 필드를 합성할 수 있습니다. 기본 생성자 매개 변수를 필드에 복사할 수 있으므로 다음 제한 사항이 적용됩니다.

  • 기본 생성자는 structclass 형식에서 선언할 수 있지만 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: 기본 생성자 매개 변수가 베이스의 멤버에 의해 섀도 처리됩니다.