이 문서에서는 다음 컴파일러 오류 및 경고를 설명합니다.
- CS0031: 상수 값 'value'를 'type'으로 변환할 수 없습니다.
- CS0056: 접근성이 일관되지 않음: 반환 형식 'type'이 연산자 'operator'보다 접근성이 떨어집니다.
- CS0057: 접근성이 일관되지 않음: 매개 변수 형식 'type'이 연산자 'operator'보다 접근성이 떨어집니다.
- CS0215: True 또는 False 연산자의 반환 형식은 bool이어야 합니다.
- CS0216: 연산자 '연산자'를 정의하려면 일치하는 연산자 'missing_operator'도 정의해야 합니다.
- CS0217: 단락 연산자로 적용하려면 사용자 정의 논리 연산자('operator')가 2 매개 변수의 형식과 동일한 반환 형식을 가져야 합니다.
- CS0218: 형식('type')에는 연산자 true 및 연산자 false의 선언이 포함되어야 합니다.
- CS0220: 작업이 컴파일 시간에 체크 모드로 오버플로됩니다.
- CS0221: 상수 값 'value'를 'type'으로 변환할 수 없습니다('unchecked' 구문을 사용하여 재정의)
-
CS0448: 또는
++연산자의 반환 형식--은 포함하는 형식이거나 포함하는 형식에서 파생되어야 합니다. - CS0463: 'error' 오류로 10진수 상수 식을 평가하지 못했습니다.
- CS0543: '열거형': 열거자 값이 너무 커서 형식에 맞지 않습니다.
- CS0552: '변환 루틴': 인터페이스로/에서 사용자 정의 변환
- CS0553: '변환 루틴': 기본 클래스로/에서 사용자 정의 변환
- CS0554: '변환 루틴': 파생 클래스로/에서 사용자 정의 변환
- CS0555: 사용자 정의 연산자는 둘러싸고 있는 형식의 객체를 가져와 같은 형식의 객체로 변환할 수 없습니다.
- CS0556: 사용자 정의 변환은 포함 형식으로 또는 포함 형식에서 변환해야 합니다.
- CS0557: 형식 내 중복된 사용자 정의 변환
- CS0558: 사용자 정의 연산자는 정적 및 공용으로 선언되어야 합니다.
-
CS0559:
++또는--연산자의 매개 변수 형식은 포함하는 형식이어야 합니다. - CS0562: 단항 연산자의 매개 변수는 포함하는 형식이어야 합니다.
- CS0563: 이진 연산자의 매개 변수 중 하나는 포함하는 형식이어야 합니다.
- CS0564: 오버로드된 시프트 연산자의 첫 번째 피연산자는 포함하는 형식과 동일한 형식이어야 하며 두 번째 피연산자의 형식은 int여야 합니다.
- CS0567: 인터페이스에 연산자를 포함할 수 없음
- CS0590: 사용자 정의 연산자는 void를 반환할 수 없습니다.
- CS0594: 부동 소수점 상수가 'type' 형식 범위를 벗어났습니다.
- CS0652: 정수 상수와 비교하는 것은 쓸모가 없습니다. 상수는 'type' 형식 범위를 벗어났습니다.
- CS0659: 'class'는 Object.Equals(object o)를 재정의하지만 Object.GetHashCode()를 재정의하지는 않습니다.
-
CS0660:
operator ==. -
CS0661: 형식은
operator ==또는operator !=를 정의하지만Object.GetHashCode()를 재정의하지 않습니다. - CS0715: 정적 클래스는 사용자 정의 연산자를 포함할 수 없습니다.
- CS1021: 정수 상수가 너무 큽니다.
- CS1037: 오버로드 가능한 연산자가 필요합니다.
- CS1553: 선언이 유효하지 않습니다. '수식자 연산자 <dest-type> (...' 대신 사용하십시오.
- CS8930: 사용자 정의 연산자의 명시적 구현을 정적으로 선언해야 합니다.
- CS8931: 인터페이스의 사용자 정의 변환은 바깥쪽 형식으로 제한되는 바깥쪽 형식의 형식 매개 변수로 변환해야 합니다.
- CS8778: 상수 값 'value'는 런타임에 'type'을 오버플로할 수 있습니다(재정의하려면 'unchecked' 구문을 사용).
- CS8973: 작업이 런타임에 오버플로될 수 있음('unchecked' 구문을 사용하여 재정의)
- CS9023: 연산자를 확인 가능하도록 만들 수 없습니다.
- CS9024: 연산자를 선택 취소할 수 없습니다.
- CS9025: 연산자는 일치하는 확인되지 않은 버전도 선언해야 합니다.
- CS9027: 예상하지 못한 키워드 'unchecked'입니다.
- CS9308: 사용자 정의 연산자는 public으로 선언되어야 합니다.
- CS9310: 이 연산자의 반환 형식은 void여야 합니다.
- CS9311: 형식은 인터페이스 멤버를 구현하지 않습니다. 형식 중 하나가 연산자가 아니므로 멤버를 구현할 수 없습니다.
- CS9312: 형식은 상속된 멤버 중 하나가 연산자가 아니므로 재정의할 수 없습니다.
- CS9313: 오버로드된 복합 할당 연산자는 하나의 매개 변수를 사용합니다.
- CS9340: 연산자는 피연산자에 적용할 수 없습니다. 적용할 수 없는 가장 가까운 후보가 표시됩니다.
- CS9341: 연산자를 피연산자에 적용할 수 없습니다. 적용할 수 없는 가장 유사한 후보가 표시됩니다.
- CS9342: 다음 멤버 간에 연산자 선택이 모호합니다.
운영자 서명 요구 사항
-
CS0448: 또는
++연산자의 반환 형식--은 포함하는 형식이거나 포함하는 형식에서 파생되어야 합니다. -
CS0559:
++또는--연산자의 매개 변수 형식은 포함하는 형식이어야 합니다. - CS0562: 단항 연산자의 매개 변수는 포함하는 형식이어야 합니다.
- CS0563: 이진 연산자의 매개 변수 중 하나는 포함하는 형식이어야 합니다.
- CS0564: 오버로드된 시프트 연산자의 첫 번째 피연산자는 포함하는 형식과 동일한 형식이어야 하며 두 번째 피연산자의 형식은 int여야 합니다.
- CS0567: 인터페이스에는 연산자를 포함할 수 없습니다.
- CS0590: 사용자 정의 연산자는 void를 반환할 수 없습니다.
- CS9310: 이 연산자의 반환 형식은 void여야 합니다.
- CS9340: 연산자는 피연산자에 적용할 수 없습니다. 적용할 수 없는 가장 가까운 후보가 표시됩니다.
- CS9341: 연산자를 피연산자에 적용할 수 없습니다. 적용할 수 없는 가장 가까운 후보가 표시됩니다.
- CS9342: 다음 멤버 간에 연산자 결정이 모호합니다.
각 연산자 형식에는 언어 사양에 의해 정의된 특정 매개 변수 및 반환 형식 요구 사항이 있습니다. 오버로드할 수 있는 연산자에 대한 전체 규칙은 C# 사양의 연산자 오버로드 및 연산 자를 참조하세요.
- 반환 형식
++또는--연산자를 포함하는 형식 또는 해당 형식에서 파생된 형식(CS0448)으로 변경합니다. 언어를 사용하려면 증가 및 감소 연산자가 포함된 형식과 호환되는 값을 반환해야 결과를 동일한 변수에 다시 할당할 수 있습니다. - 또는
++연산자의--매개 변수를 포함하는 형식(CS0559)으로 변경합니다. 증가 및 감소 연산자는 자체 형식의 인스턴스에서 작동해야 합니다. - 단항 연산자의 매개 변수를 포함하는 형식(CS0562)으로 변경합니다. 단항 연산자는 해당 연산자를 선언하는 형식의 피연산자를 수락해야 합니다.
- 이진 연산자의 매개 변수가 포함된 형식(CS0563)이 하나 이상인지 확인합니다. 이진 연산자는 컴파일러가 선언된 형식을 통해 이를 해결할 수 있도록 해야 합니다.
- Shift 연산자의 첫 번째 매개 변수를 포함하는 형식으로 변경하고 두 번째 매개 변수를
int(CS0564)로 변경합니다. 언어는 특정 시그니처를 사용하여 시프트 연산자를 정의합니다. 즉, 이동되는 형식과 정수 시프트 크기입니다. - 연산자 선언을 인터페이스 외부와 클래스 또는 구조체(CS0567)로 이동합니다. 기존(비정적 추상) 연산자 선언은 인터페이스에서 허용되지 않습니다. 인터페이스의 정적 추상 연산자는 정적 추상 및 가상 인터페이스 멤버 오류를 참조하세요.
- 연산자의 반환 형식을 void가 아닌 형식(CS0590)으로 변경합니다. 대부분의 사용자 정의 연산자는 값을 반환해야 합니다. 반환 형식(
void)이 필요한 복합 할당 연산자는 예외입니다. - 컴파일러가 호출 사이트에서 사용되는 피연산자 형식(CS9340, CS9341)에 대해 일치하는 연산자를 찾을 수 있도록 매개 변수 형식을 수정하거나 누락된 연산자 오버로드를 추가합니다. 적용 가능한 연산자가 없는 경우 컴파일러는 불일치를 진단하는 데 도움이 되는 가장 가까운 후보를 표시합니다.
- 호출 사이트에서 명시적 캐스트를 추가하거나 여러 연산자 오버로드가 동일하게 일치하는 경우 모호성을 제거하기 위해 보다 구체적인 오버로드를 제공합니다(CS9342).
중요합니다
정적 이진 연산자와 해당 인스턴스 복합 할당 연산자의 서명 요구 사항은 다릅니다. 서명이 원하는 선언과 일치하는지 확인합니다.
운영자 선언 요구 사항
- CS0558: 사용자 정의 연산자는 정적 및 공용으로 선언되어야 합니다.
- CS0715: 정적 클래스는 사용자 정의 연산자를 포함할 수 없습니다.
- CS1037: 오버로드 가능한 연산자가 필요합니다.
- CS1553: 선언이 유효하지 않습니다. 대신 '수정 연산자 <데스트 타입> (...'를 사용하십시오.
- CS9308: 사용자 정의 연산자는 public으로 선언되어야 합니다.
언어에는 연산자 선언에 대한 특정 한정자와 구문이 필요합니다. 전체 규칙은 연산자 오버로드 및 사용자 정의 변환 연산자를 참조하세요.
- 연산자 선언에
static및public한정자를 추가합니다 (CS0558, CS9308). C# 언어를 사용하려면 모든 사용자 정의 연산자가 정적 연산자와 공용이어야 하므로 인스턴스 없이 액세스할 수 있고 호출할 수 있습니다. - 정적 클래스에서 비정적 클래스 또는 구조체(CS0715)로 연산자 선언을 이동합니다. 정적 클래스에는 인스턴스가 있을 수 없으므로 포함하는 형식의 인스턴스에서 작동하는 사용자 정의 연산자는 정적 클래스에서 의미가 없습니다.
- 잘못된 연산자 기호를 유효한 오버로드 가능한 연산 자(CS1037)로 바꿉니다. 언어로 정의된 특정 연산자만 오버로드할 수 있습니다.
- 필요한 변환 연산자 형식
public static implicit operator <dest-type>(<source-type> parameter)(또는public static explicit operator <dest-type>(<source-type> parameter)CS1553)을 따르도록 구문을 수정합니다. 컴파일러는 변환 연산자가 특정 선언 패턴을 따라야 합니다.
정적 추상 인터페이스에서 연산자의 명시적 인터페이스 구현과 관련된 오류는 정적 추상 및 가상 인터페이스 멤버 오류를 참조하세요.
일관되지 않은 접근성
- CS0056: 일관성 없는 접근성: 반환 형식 'type'은 연산자 'operator'보다 접근성이 떨어집니다.
- CS0057: 접근성이 일치하지 않습니다. 매개 변수 형식 'type'은 연산자 'operator'보다 접근성이 떨어집니다.
공용 연산자의 서명에 사용되는 모든 형식은 적어도 연산자 자체만큼 액세스할 수 있어야 합니다. 전체 규칙은 C# 사양의 Access 한정자 및 접근성 제약 조건을 참조하세요.
- 반환 형식을 적어도 연산자로 액세스할 수 있는 형식으로 변경하거나 반환 형식(CS0056)과 일치하도록 연산자의 접근성을 줄입니다.
public어셈블리 외부의 호출자는 결과를 사용할 수 없으므로 연산자는 반환 값을 통해 접근성이 낮은 형식을 노출할 수 없습니다. - 매개 변수 형식을 적어도 연산자로 액세스할 수 있는 형식으로 변경하거나 매개 변수 형식(CS0057)과 일치하도록 연산자의 접근성을 줄입니다.
public어셈블리 외부의 호출자가 인수를 제공할 수 없으므로 연산자는 접근성이 낮은 형식을 매개 변수로 요구할 수 없습니다.
사용자 정의 변환 제한
- CS0552: 인터페이스로/에서 사용자 정의 변환.
- CS0553: 기본 클래스로/에서 사용자 정의 변환
- CS0554: 파생 클래스에 대한 사용자 정의 변환입니다.
- CS0555: 사용자 정의 연산자는 바깥쪽 형식의 개체를 가져와 바깥쪽 형식의 개체로 변환할 수 없습니다.
- CS0556: 사용자 정의 변환은 포함하는 형식으 로 또는 포함하는 형식으로 변환해야 합니다.
- CS0557: 형식 내 중복된 사용자 정의 변환입니다.
C# 언어는 사용자 정의 변환에 참여할 수 있는 형식을 제한합니다. 전체 규칙은 C# 사양에서 사용자 정의 변환 연산 자 및 변환 연산 자를 참조하세요.
- 인터페이스 형식(CS0552)으로 변환하거나 인터페이스 형식에서 변환하는 변환 연산자를 제거합니다. 인터페이스 변환은 형식 시스템의 참조 변환 및 boxing을 통해 처리되므로 이 언어는 인터페이스 형식과 관련된 사용자 정의 변환을 금지합니다. 대신 명시적 인터페이스 구현 또는 도우미 메서드를 사용합니다.
- 기본 클래스(CS0553)로 변환하거나 기본 클래스에서 변환하는 변환 연산자를 제거합니다. 형식과 해당 기본 클래스 간의 변환은 암시적 참조 변환(업캐스트) 및 명시적 참조 변환(다운캐스트)을 통해 이미 존재하므로 사용자 정의 변환은 모호성을 만듭니다.
- 파생 클래스(CS0554)로 변환하거나 파생 클래스에서 변환하는 변환 연산자를 제거합니다. 기본 클래스 변환과 마찬가지로 형식과 파생 형식 간의 변환은 상속을 통해 언어에 기본 제공되고 사용자 정의 변환은 해당 변환과 충돌합니다.
- 감싸는 형식을 자체로 변환하는 변환 연산자(CS0555)를 제거합니다. 모든 형식에는 이미 암시적 ID 변환이 있으므로 형식에서 동일한 형식으로의 사용자 정의 변환은 중복되며 허용되지 않습니다.
- 변환 연산자의 형식 중 하나를 변경하여 원본 또는 대상 형식이 바깥쪽 형식(CS0556)이 되도록 합니다. 사용자 정의 변환에는 이를 선언하는 형식이 포함되어야 합니다. 세 번째 형식에서는 관련이 없는 두 외부 형식 간의 변환을 정의할 수 없습니다.
- 중복 변환 연산자를 제거하거나 원본 및 대상 형식이 다른 형식과 달라지도록 중복 연산자 중 하나를 변경합니다(CS0557). 형식은 지정된 원본 및 대상 형식 쌍에 대해 하나의 암시적 변환과 하나의 명시적 변환만 선언할 수 있습니다.
불린 및 단락 회로 연산자
- CS0215: true 또는 false 연산자의 반환 형식은 bool이어야 합니다.
- CS0216: 연산자를 정의하려면 일치하는 연산자도 정의해야 합니다.
- CS0217: 단락 연산자로 적용하려면 사용자 정의 논리 연산자가 2개 매개 변수의 형식과 동일한 반환 형식을 가져야 합니다.
- CS0218: 형식에는 연산자 true 및 연산자 false 선언이 포함되어야 합니다.
C# 언어에는 부울 연산자 및 단락 평가를 위한 특정 페어링 및 서명이 필요합니다. 전체 규칙은 C# 사양에서 true 및 false 연산자, 부울 논리 연산자 및 사용자 정의 조건부 논리 연산자를 참조하세요.
-
operator true과operator false의 반환 형식을bool로 변경하십시오 (CS0215). 이러한 연산자는 값이 논리적으로 true인지 false인지 여부를 결정하므로 언어에서 반환bool해야 합니다. - 일치하는 쌍을 이루는 연산자(CS0216)를 정의합니다. 언어에서는 특정 연산자를 쌍으로 선언해야 합니다:
operator ==와operator !=,operator <와operator >,operator <=와operator >=,operator true와operator false. - 두 매개 변수 형식(
&)과 일치하도록 사용자 정의|또는 연산자의 반환 형식을 변경합니다. 단락 평가(&&및||)의 경우, 컴파일러는&또는|연산자의 반환 형식, 두 매개 변수 형식, 그리고 포함하는 형식이 모두 동일한 형식이 되어야 합니다. - 형식에
operator true및operator false선언을 추가합니다 (CS0218). 컴파일러는&&및||을operator true와operator false를 사용하여 다시 작성하고, 해당&또는|연산자를 사용하므로, 단락 평가가 작동하려면 이 세 가지가 모두 필수적으로 존재해야 합니다.
확인된 연산자
- CS9023: 연산자를 검사 모드로 만들 수 없습니다.
- CS9024: 연산자를 선택 취소할 수 없습니다.
- CS9025: 확인된 연산자를 사용하려면 일치하는 확인되지 않은 버전도 선언해야 합니다.
- CS9027: 예기치 않은 키워드 'unchecked'
checked 및 unchecked 키워드는 특정 연산자 선언에만 적용할 수 있습니다. 전체 규칙은 산술 연산자 및 사용자 정의 확인 연산자를 참조하세요.
- 지원되지 않는 연산자(CS9023, CS9024)에서
checked또는unchecked키워드를 제거합니다. 명시적 변환 연산자와 산술 연산자+,-,*,/,++,--만이 확인된 및 확인되지 않은 버전을 지원합니다. 비교 또는 같음 연산자와 같은 다른 연산자는 고유한 오버플로 동작이 없으며 선택 또는 선택 취소로 표시할 수 없습니다. - 일치하는 확인되지 않은 연산자 버전을 추가합니다(CS9025).
checked연산자는 오버플로 예외 발생 동작을 제공하지만, 컴파일러는unchecked컨텍스트에서 사용하고 어떤 컨텍스트도 지정되지 않은 경우 기본값으로 사용할 해당 검사되지 않는 버전도 필요합니다. -
unchecked잘못된 위치(CS9027)에서 키워드를 제거합니다.unchecked연산자 선언의 키워드는 연산자 구문(예public static explicit operator unchecked int(MyType t): )의 일부로만 유효합니다. 선언의 다른 위치에 배치하면 구문 오류가 발생합니다.
인터페이스 및 상속 요구 사항
- CS9311: 형식은 인터페이스 멤버를 구현하지 않습니다. 형식 중 하나가 연산자가 아니므로 멤버를 구현할 수 없습니다.
- CS9312: 형식은 상속된 멤버 중 하나가 연산자가 아니므로 재정의할 수 없습니다.
- CS9313: 오버로드된 복합 할당 연산자는 하나의 매개 변수를 사용합니다.
컴파일러는 연산자 선언과 구현하거나 재정의하는 인터페이스 멤버 또는 기본 클래스 멤버 간에 엄격한 일치를 적용합니다. 전체 규칙은 연산자 오버로드 및 인터페이스를 참조하세요.
- 구현 멤버를 인터페이스의 연산자 멤버와 일치하는 연산자 선언으로 변경하거나 구현 멤버가 메서드인 경우 인터페이스 멤버를 메서드로 변경합니다(CS9311). 연산자는 연산자로 선언된 인터페이스 멤버만 구현할 수 있습니다. 즉, 일반 메서드로 연산자 계약을 충족할 수 없거나 그 반대의 경우도 마찬가지입니다.
- 재정의 멤버를 기본 클래스의 연산자 멤버와 일치하는 연산자 선언으로 변경하거나 파생 클래스 멤버가 메서드인 경우 기본 클래스 멤버를 메서드로 변경합니다(CS9312). 인터페이스 구현과 마찬가지로 재정의는 재정의되는 멤버 종류와 일치해야 합니다. 연산자는 비 연산자 멤버를 재정의할 수 없습니다.
- 정확히 하나의 매개 변수를 허용하도록 복합 할당 연산자 선언을 변경합니다(CS9313). 복합 할당 연산자는 왼쪽 피연산자가 암시적으로
this있는 인스턴스 멤버이므로 오른쪽 피연산자만 매개 변수로 선언됩니다.
동등 연산자
- CS0659: 'class'는 Object.Equals(object o)를 재정의하지만 Object.GetHashCode()를 재정의하지는 않습니다.
- CS0660: Type은 연산자 == 또는 연산자 !=를 정의하지만 Object.Equals(object o)를 재정의하지는 않습니다.
- CS0661: Type은 연산자 == 또는 연산자 !=를 정의하지만 Object.GetHashCode()를 재정의하지는 않습니다.
컴파일러는 동등성 관련 재정의와 연산자 정의가 일관성을 유지해야 합니다. Object.Equals을(를) 재정의하거나 operator == / operator !=을(를) 정의할 때, 관련된 재정의를 반드시 포함해야 합니다. 전체 규칙은 형식 및 같음 연산자의 값 같음을 정의하는 방법을 참조하세요.
-
Object.Equals를 재정의할 때 Object.GetHashCode의 오버라이드를 추가합니다(CS0659). 해시 기반 컬렉션은 동일한 두 개체가 같은 해시 코드를 반환해야 하는 계약을 기반으로 합니다. Dictionary<TKey,TValue>와 HashSet<T> 같은 컬렉션 등에서 사용됩니다. 일치하는
GetHashCode재정의가 없으면 동일하게 비교되는 개체가 다른 버킷에 해시되어 조회 및 중복 제거가 자동으로 실패할 수 있습니다. - 정의할 때 Object.Equals 또는
operator ==(operator !=)의 재정의를 추가하세요. 많은 프레임워크 API, LINQ 메서드 및 컬렉션 작업을 포함하여 직접 호출Equals하는 코드는 사용자 지정 연산자를 사용하지 않습니다. 일관된Equals재정의가 없으면 동일한 두 개체가==에서는 같다고 간주될 수 있지만,Equals에서는 같지 않다고 간주되어 예측할 수 없는 동작이 발생할 수 있습니다. -
Object.GetHashCode 또는
operator ==를 정의할 때 재정의를 추가하세요 (operator !=). CS0659와 마찬가지로, 같음 의미 체계에 일관성을 유지해야 합니다GetHashCode. 두 개체가 같지만 다른 해시 코드를 반환하는 경우operator ==해시 기반 컬렉션이 제대로 작동하지 않습니다.
오버플로 및 언더플로 오류
- CS0031: 상수 값 'value'를 'type'으로 변환할 수 없습니다.
- CS0220: 작업이 컴파일 시간에 체크 모드에서 오버플로우됩니다.
- CS0221: 상수 값 'value'를 'type'으로 변환할 수 없습니다('unchecked' 구문을 사용하여 재정의)
- CS0463: 'error' 오류로 10진수 상수 식을 평가하지 못했습니다.
- CS0543: '열거형': 열거자 값이 너무 커서 형식에 맞지 않습니다.
- CS0594: 부동 소수점 상수가 'type' 형식 범위를 벗어났습니다.
- CS0652: 정수 상수와 비교하는 것은 쓸모가 없습니다. 상수는 'type' 형식 범위를 벗어났습니다.
- CS1021: 정수 상수가 너무 큽니다.
- CS8778: 상수 값 'value'는 런타임에 'type'을 오버플로할 수 있습니다(재정의하려면 'unchecked' 구문을 사용).
- CS8973: 작업이 런타임에 오버플로될 수 있음('unchecked' 구문을 사용하여 재정의)
컴파일러는 컴파일 시간에 상수 식을 평가하고 값이 대상 형식의 유효한 범위를 초과할 때 오류 또는 경고를 보고합니다. 전체 규칙은 검사된 문과 검사되지 않은 문 및 정수 형식을 참조하세요.
- 상수 값을 대상 형식의 범위에 맞는 값으로 변경하거나 대상을 더 큰 숫자 형식(CS0031)으로 변경합니다. 컴파일러는 적합하지 않은 상수의 범위를 암시적으로 좁힐 수 없습니다. 예를 들어 (범위 0-255)에 할당
256byte하면 이 오류가 발생합니다. 잘림이 의도적인 경우unchecked컨텍스트에서 명시적 캐스트를 사용합니다. - 결과가 대상 형식에 적합하도록 식의 산술 연산을 수정하거나, 검사되지 않은 컨텍스트에서 식을 래핑하여 묵시적 오버플로(CS0220)를 허용합니다. 컴파일러는 기본적으로 확인된 컨텍스트에서 컴파일 시간에 전체 상수 식을 평가하므로 형식 범위를 초과하는 중간 또는 최종 결과가 이 오류를 발생합니다.
- 변환이 유효하게 상수 값 또는 대상 형식을 변경하거나, 잘린 결과(
unchecked)를 의도적으로 원하는 경우 컨텍스트에서 식을 래핑합니다. CS0220과 달리 이 오류는 원본 값이 대상 형식에 맞지 않는 명시적 상수 변환에 적용됩니다. - 상수 식
decimal을 단순화하거나 분해하여decimal형식의 범위 및 정밀도 내에 유지되도록 합니다(CS0463). 타입decimal의 최대값은 약 $7.9 \times 10^{28}$이고 유효 자릿수는 28~29입니다. 컴파일러는 컴파일 시간에 전체 식을 평가합니다. - 열거형 멤버 값을 열거형의 내부 형식에 맞는 값으로 변경하거나 기본 형식을 더 큰 정수 형식(CS0543)으로 변경합니다. 기본적으로 열거형은
int를 기본 형식으로 사용합니다. 멤버의 값이 기본 형식의 범위를 초과하는 경우 더 큰 형식을 지정합니다( 예:long.). - 부동 소수점 상수는 대상 형식 범위 내의 값으로 변경하거나(
double) 대신float처럼 정밀도가 높은 형식 을 사용합니다. 이 형식은float최대 $3.4 \times 10^{38}$의 값을 지원하며double최대 $1.7 \times 10^{308}$까지 지원합니다. - 상수가 변수 형식(CS0652)의 범위 내에 있도록 비교를 제거하거나 수정합니다. 예를 들어 변수를
byte300비교하는 것은 true일 수 없으므로 컴파일러는 비교가 쓸모가 없다고 경고합니다. 이 경고는 변수 형식과 의도한 값 범위 간의 논리 오류 또는 불일치를 나타내는 경우가 많습니다. - 더 큰 숫자 형식을 사용하거나 여러 작업(CS1021)에서 값을 분할합니다. 이 오류는 정수 리터럴이 가장 큰 정수 형식의 범위(
ulong최대 $1.8 \times 10^{19}$)를 초과할 때 발생합니다. 해당 범위를 벗어나는 값의 경우 BigInteger를 사용하는 것이 좋습니다. - 컨텍스트에서
unchecked식을 래핑하여 경고를 표시하지 않거나 대상 형식의 범위(CS8778) 내에 맞게 값을 변경합니다. 이 경고는 런타임에 데이터가 손실될 수 있는 상수 변환을 나타냅니다. 컴파일러는 오버플로가 확실히 발생한다는 것을 증명할 수는 없지만 위험을 식별합니다. - 경고를 억제하기 위해 컨텍스트에서
unchecked식을 래핑하거나 산술 연산을 재구성하여 잠재적 오버플로를 방지할 수 있습니다(CS8973). 이 경고는 CS8778 과 유사하지만 변환이 아닌 산술 작업에 적용됩니다. 컴파일러는 런타임에 작업이 오버플로될 수 있음을 감지합니다.
.NET