메모
이 문서는 기능 사양입니다. 사양은 기능의 디자인 문서 역할을 합니다. 여기에는 기능 디자인 및 개발 중에 필요한 정보와 함께 제안된 사양 변경 내용이 포함됩니다. 이러한 문서는 제안된 사양 변경이 완료되고 현재 ECMA 사양에 통합될 때까지 게시됩니다.
기능 사양과 완료된 구현 간에 약간의 불일치가 있을 수 있습니다. 이러한 차이는관련
사양문서에서 C# 언어 표준에 기능 사양 초안을 채택하는 과정에 대해 자세히 알아볼 수 있습니다.
챔피언 이슈: https://github.com/dotnet/csharplang/issues/4666
요약
시프트 연산자 요구 사항이 완화되어, 오른쪽 피연산자는 더 이상 int로만 제한되지 않습니다.
동기
int이외의 형식을 다룰 때, 다른 계산 결과를 활용하여, 예를 들어 leading zero count을 기반으로 이동하는 경우가 흔히 있습니다.
leading zero count 같은 자연 형식은 입력 형식(TSelf)과 같으므로 대부분의 경우 결과가 이미 범위 내에 있더라도 이동하기 전에 해당 결과를 int 변환해야 합니다.
라이브러리가 노출하려는 제네릭 수학 인터페이스의 컨텍스트 내에서 형식이 잘 알려지지 않아 int 변환이 불가능하거나 잘 정의되지 않을 수 있으므로 잠재적으로 문제가 될 수 있습니다.
상세 디자인
시프트 연산자
§12.11 다음과 같이 다시 입력해야 합니다.
- When declaring an overloaded shift operator, the type of the first operand must always be the class or struct containing the operator declaration,
and the type of the second operand must always be int.
+ When declaring an overloaded shift operator, the type of the first operand must always be the class or struct containing the operator declaration.
즉, 첫 번째 피연산자가 연산자 선언을 포함하는 클래스 또는 구조체라는 제한은 그대로 유지됩니다.
두 번째 피연산자가 int으로 제한되는 규정이 제거되었습니다.
이진 연산자
§14.10.3 다음과 같이 다시 입력해야 합니다.
-* A binary `<<` or `>>` operator must take two parameters, the first of which must have type `T` or `T?` and the second of which must have type `int` or `int?`, and can return any type.
+* A binary `<<` or `>>` operator must take two parameters, the first of which must have type `T` or `T?`, and can return any type.
즉, 첫 번째 매개 변수를 T 또는 T? 제한은 그대로 유지됩니다.
두 번째 피연산자가 반드시 int 또는 int?이어야 한다는 제한이 제거됩니다.
이진 연산자 오버로드 해석
§11.4.5 첫 번째 글머리 기호는 다음과 같이 다시 작성되어야 합니다.
- 작업
X대한Y및operator op(x,y)제공하는 후보 사용자 정의 연산자 집합이 결정됩니다. 집합은 연산자가 shift 연산자가 아닌 한및 제공하는 후보 연산자의 합합으로 구성되며, 각각 §11.4.6제공된 후보 연산자를 후보 사용자 정의 연산자의 규칙을 사용하여 결정됩니다. X및Y동일한 형식이거나X및Y공통 기본 형식에서 파생된 경우 공유 후보 연산자는 결합된 집합에서 한 번만 발생합니다.
즉, 시프트 연산자의 경우 후보 연산자는 형식 X에 의해 제공된 연산자들만 해당합니다.
단점
사용자는 C#에서 cout << "string" 구현하는 등 권장 지침을 따르지 않는 연산자를 정의할 수 있습니다.
대안
라이브러리에 의해 노출되는 제네릭 수학 인터페이스는 명시적으로 명명된 메서드를 대신 노출할 수 있습니다. 이렇게 하면 코드를 읽기/유지 관리하기가 더 어려워질 수 있습니다.
제네릭 수학 인터페이스에는 int 교대 근무가 필요하며 변환이 수행되어야 할 수 있습니다.
이 변환은 비용이 많이 들거나 문제의 유형에 따라 불가능할 수 있습니다.
해결되지 않은 질문
두 번째 피연산자가 int으로 제한된 데 대한 "의도"를 보존하려는 데 우려가 있습니까?
디자인 회의
https://github.com/dotnet/csharplang/blob/main/meetings/2022/LDM-2022-02-09.md
C# feature specifications