교대 근무 운영자 요구 사항 완화
메모
이 문서는 기능 사양입니다. 사양은 기능의 디자인 문서 역할을 합니다. 여기에는 기능 디자인 및 개발 중에 필요한 정보와 함께 제안된 사양 변경 내용이 포함됩니다. 이러한 문서는 제안된 사양 변경이 완료되고 현재 ECMA 사양에 통합될 때까지 게시됩니다.
기능 사양과 완료된 구현 간에 약간의 불일치가 있을 수 있습니다. 이러한 차이는관련
사양문서에서 C# 언어 표준에 기능 사양 초안을 채택하는 과정에 대해 자세히 알아볼 수 있습니다.
요약
시프트 연산자 요구 사항이 완화되어, 오른쪽 피연산자는 더 이상 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