언어 기능 및 버전과 관련된 경고 해결
이 문서에서는 다음 컴파일러 경고에 대해 설명합니다.
- CS8022, CS8023, CS8024, CS8025, CS8026, CS8059, CS8107, CS8302, CS8320, CS8370, CS8400, CS8773, CS8936, CS9058: 기능을 사용할 수 없습니다. 최신 언어 버전을 사용합니다.
- CS8058: 기능은 실험적입니다.
- CS8192: 제공한 언어 버전이 지원되지 않거나 잘못되었습니다.
- CS8303: 지정된 언어 버전에는 앞에 오는 0을 사용할 수 없습니다.
- CS8304: 컴파일러 버전이 언어 버전보다 낮습니다.
- CS1738: 명명된 인수 사양은 모든 고정 인수를 지정한 다음에 와야 합니다
- CS8306: 튜플 요소 이름이 유추됩니다.
- CS8314: 형식의 식을 형식의 패턴으로 처리할 수 없습니다.
- CS8371: 필드 대상 특성이 언어 버전에서 지원되지 않습니다.
- CS8401: 보간된 축자 문자열에
$@
대신@$
를 사용하려면 최신 언어 버전을 사용합니다. - CS8511: 형식의 식을 형식의 패턴으로 처리할 수 없습니다.
- CS8627: null 허용 형식 매개 변수는 값 형식 또는 null 허용이 아닌 참조 형식으로 알려져 있어야 합니다.
- CS8630: null 허용 옵션이 잘못되었습니다. 최신 언어 버전 사용
- CS8652: 한정자는 이 항목에 사용할 수 없습니다.
- CS8704: 형식은 인터페이스 멤버를 구현하지 않습니다. 비공용 멤버를 암시적으로 구현할 수 없습니다.
- CS8706: 이 버전에서 기능을 사용할 수 없으므로 형식에서 인터페이스 멤버를 구현할 수 없습니다.
- CS8904: 잘못된 가변성: 형식 매개 변수가 유효해야 합니다.
- CS8912: 봉인된 'Object.ToString'이 있는 레코드에서 상속하는 것은 지원되지 않습니다.
- CS8919: 대상 런타임이 인터페이스에서 정적 추상 멤버를 지원하지 않으므로 형식에서 지정된 인터페이스 멤버를 구현할 수 없습니다.
- CS8929: 대상 런타임이 인터페이스의 정적 추상 멤버를 지원하지 않으므로 메서드는 형식의 인터페이스 멤버를 구현할 수 없습니다.
- CS8957: 형식 간에 공통 형식을 찾을 수 없으므로 언어 버전에서 조건식이 유효하지 않습니다.
- CS8967: 축자로 보간되지 않은 문자열 내의 줄 바꿈은 C#에서 지원되지 않습니다.
- CS9014: 오류: 할당되지 않은 속성을 사용합니다. 속성을 자동 기본값으로 업그레이드합니다.
- CS9015: 오류: 할당되지 않은 필드를 사용합니다. 필드를 자동으로 기본값으로 업그레이드합니다.
- CS9016: 경고: 할당되지 않은 속성을 사용합니다. 속성을 자동 기본값으로 업그레이드합니다.
- CS9017: 경고: 할당되지 않은 필드를 사용합니다. 필드를 자동으로 기본값으로 업그레이드합니다.
- CS9064: 대상 런타임은 ref 필드를 지원하지 않습니다.
- CS9103: '11'을 예상하는 인식할 수 없는 RefSafetyRulesAttribute 버전을 사용하는 모듈의 정의입니다.
- CS9171: 대상 런타임은 인라인 배열 형식을 지원하지 않습니다.
- CS9194: 인수가
ref
키워드와 함께 전달되지 않을 수 있습니다.in
매개 변수에ref
인수를 전달하려면 언어 버전 12 이상으로 업그레이드합니다. - CS9202: 이 기능은 C# 12.0에서 사용할 수 없습니다. 최신 언어 버전을 사용하세요.
- CS9211: 'Experimental' 특성에 대한 diagnosticId 인수는 유효한 식별자여야 합니다.
- CS9240: 대상 런타임은 by-ref-like 제네릭을 지원하지 않습니다.
- CS9260: C# 13.0에서는 기능을 사용할 수 없습니다. 최신 언어 버전을 사용하세요.*
또한 다음 오류 및 경고는 최근 버전의 구조체 초기화 변경과 관련이 있습니다.
- CS0171, CS8881: ‘제어를 호출자에게 반환하려면 자동으로 구현된 'name' 속성의 지원 필드가 완전히 할당되어야 합니다.’
- CS0188, CS8885: ‘모든 필드에 값을 할당하기 전에는 'this' 개체를 사용할 수 없습니다.’
- CS0843, CS8880: ‘제어를 호출자에게 반환하려면 자동으로 구현된 'name' 속성의 지원 필드가 완전히 할당되어야 합니다.’
- CS8305: 기능은 평가 목적으로만 제공되며 향후 업데이트에서 변경 또는 제거될 수 있습니다.
- CS9204: 형식은 평가 목적으로 제공되며, 이후 업데이트에서 변경되거나 제거될 수 있습니다. 계속하려면 이 진단을 표시하지 않습니다.
이러한 모든 오류 및 경고의 원인은 설치된 컴파일러가 프로젝트에서 선택한 버전보다 최신 버전의 C#을 지원한다는 것입니다. C# 컴파일러는 이전 버전과 호환될 수 있습니다. 이전 버전의 C#에 대해 구문의 유효성을 검사할 수 있거나, 프로젝트에서 이전 라이브러리 또는 런타임을 지원해야 하기 때문에 유효성을 검사할 수 있습니다.
이러한 오류 및 경고의 경우 두 가지 가능한 원인과 세 가지 해결 방법이 있습니다.
대상 프레임워크 업데이트
컴파일러는 다음 규칙에 따라 기본값을 결정합니다.
Target | 버전 | C# 언어 버전 기본값 |
---|---|---|
.NET | 9.x | C# 13 |
.NET | 8.x | C# 12 |
.NET | 7.x | C# 11 |
.NET | 6.x | C# 10 |
.NET | 5.x | C# 9.0 |
.NET Core | 3.x | C# 8.0 |
.NET Core | 2.x | C# 7.3 |
.NET Standard | 2.1 | C# 8.0 |
.NET Standard | 2.0 | C# 7.3 |
.NET Standard | 1.x | C# 7.3 |
.NET Framework | 모두 | C# 7.3 |
선택한 프레임워크가 필요한 언어 버전과 일치하지 않는 경우 대상 프레임워크를 업그레이드할 수 있습니다.
일치하는 언어 버전 선택
프로젝트 파일에서 이전 대상 프레임워크를 선택할 수 있습니다. 프로젝트 파일에서 LangVersion
요소를 제거하면 컴파일러는 이전 섹션에 나열된 기본값을 사용합니다. 모든 표는 현재 C# 언어 버전을 보여줍니다. 특정 언어 버전을 지정하여 최신 기능을 사용하도록 설정할 수도 있습니다.
값 | 의미 |
---|---|
preview |
컴파일러가 최신 미리 보기 버전의 유효한 언어 구문을 모두 허용합니다. |
latest |
컴파일러가 최신 릴리스 버전(부 버전 포함)의 구문을 허용합니다. |
latestMajor 또는 default |
컴파일러가 최신 릴리스 주 버전의 구문을 허용합니다. |
13.0 |
컴파일러는 C# 13 이하에 포함된 구문만 허용합니다. |
12.0 |
컴파일러는 C# 12 이하에 포함된 구문만 허용합니다. |
11.0 |
컴파일러는 C# 11 이하에 포함된 구문만 허용합니다. |
10.0 |
컴파일러는 C# 10 이하에 포함된 구문만 허용합니다. |
9.0 |
컴파일러는 C# 9 이하에 포함된 구문만 허용합니다. |
8.0 |
컴파일러는 C# 8.0 이하에 포함된 구문만 허용합니다. |
7.3 |
컴파일러는 C# 7.3 이하에 포함된 구문만 허용합니다. |
7.2 |
컴파일러는 C# 7.2 이하에 포함된 구문만 허용합니다. |
7.1 |
컴파일러는 C# 7.1 이하에 포함된 구문만 허용합니다. |
7 |
컴파일러는 C# 7.0 이하에 포함된 구문만 허용합니다. |
6 |
컴파일러는 C# 6.0 이하에 포함된 구문만 허용합니다. |
5 |
컴파일러는 C# 5.0 이하에 포함된 구문만 허용합니다. |
4 |
컴파일러는 C# 4.0 이하에 포함된 구문만 허용합니다. |
3 |
컴파일러는 C# 3.0 이하에 포함된 구문만 허용합니다. |
ISO-2 또는 2 |
컴파일러는 ISO/IEC 23270:2006 C#(2.0)에 포함된 구문만 허용합니다. |
ISO-1 또는 1 |
컴파일러는 ISO/IEC 23270:2003 C#(1.0/1.2)에 포함된 구문만 허용합니다. |
각 프레임워크 버전에 대해 지원되는 언어 버전에 대한 자세한 내용은 언어 참조 섹션의 언어 버전 구성 문서에서 확인할 수 있습니다.
업데이트된 기능 방지
이전 라이브러리 또는 런타임을 지원해야 하는 경우 최신 기능을 사용하지 않아야 할 수 있습니다.
실험적 기능 사용
실험적 기능에 대한 진단을 사용하지 않도록 설정하여 실험적 기능을 사용할 수 있습니다.
Warning
실험적 기능은 변경될 수 있습니다. API가 변경되거나 향후 업데이트에서 제거될 수 있습니다. 실험적 기능을 포함하는 것은 라이브러리 작성자가 향후 개발을 위한 아이디어와 개념에 대한 피드백을 얻을 수 있는 방법입니다. 실험적으로 표시된 기능을 사용할 때는 주의해야 합니다.
System.Diagnostics.CodeAnalysis.ExperimentalAttribute을(를) 사용하여 고유한 실험적 기능을 선언할 수도 있습니다. 컴파일러는 실험적 기능에 사용되는 식별자가 유효한 식별자가 아닌 경우 CS9211을 내보냅니다.
구조체 초기화의 호환성이 손상되는 변경
이러한 모든 오류 및 경고는 struct
형식의 필드에 액세스하기 전에 해당 형식을 올바르게 초기화되도록 하는 데 도움이 됩니다. 이전 버전의 C#에서는 모든 생성자의 구조체에 있는 모든 필드를 명시적으로 할당해야 합니다. 매개 변수가 없는 생성자는 모든 필드를 기본값으로 초기화합니다. 이후 버전에서는 모든 생성자가 모든 필드를 초기화합니다. 필드가 명시적으로 설정되거나, 필드 이니셜라이저에서 설정되거나, 기본값으로 설정됩니다.
- CS0171, CS8881: ‘제어를 호출자에게 반환하려면 자동으로 구현된 'name' 속성의 지원 필드가 완전히 할당되어야 합니다.’
- CS0188, CS8885: ‘모든 필드에 값을 할당하기 전에는 'this' 개체를 사용할 수 없습니다.’
- CS0843, CS8880: ‘제어를 호출자에게 반환하려면 자동으로 구현된 'name' 속성의 지원 필드가 완전히 할당되어야 합니다.’
언어 버전을 C# 11로 업그레이드하면 모든 struct
생성자가 모든 필드를 초기화하여 이 오류를 해결할 수 있습니다. 가능한 옵션이 아닌 경우 다음 예제와 같이 기본 생성자를 명시적으로 호출해야 합니다.
struct S
{
public int AIProp { get; set; }
public S(int i){} //CS0843
// Try the following lines instead.
// public S(int i) : this()
// {
// AIProp = i;
// }
}
class Test
{
static int Main()
{
return 1;
}
}
.NET