Uvolnění požadavků operátoru směny
Poznámka
Tento článek je specifikace funkce. Specifikace slouží jako návrhový dokument pro funkci. Zahrnuje navrhované změny specifikace spolu s informacemi potřebnými při návrhu a vývoji funkce. Tyto články se publikují, dokud nebudou navrhované změny specifikace finalizovány a začleněny do aktuální specifikace ECMA.
Mezi specifikací funkce a dokončenou implementací může docházet k nějakým nesrovnalostem. Tyto rozdíly jsou zachyceny v poznámkáchpříslušné schůzky návrhu jazyka (LDM)
Další informace o procesu přijetí specifikací funkcí do jazyka C# najdete v článku o specifikacích .
Shrnutí
Požadavky operátoru posunu budou uvolněny tak, aby pravý operand již nebyl omezen pouze na int
.
Motivace
Při práci s jinými typy než int
není neobvyklé, že se posunete pomocí výsledku jiného výpočtu, například posunu na základě leading zero count
. Přirozený typ něčeho jako leading zero count
je stejný jako vstupní typ (TSelf
) a v mnoha případech to vyžaduje, abyste tento výsledek před posunem převedli na int
, i když je tento výsledek již v rozsahu.
V kontextu obecných matematických rozhraní, která knihovny plánují zveřejnit, je to potenciálně problematické, protože typ není dobře známý, a proto převod na int
nemusí být možný nebo dokonce dobře definovaný.
Podrobný návrh
Operátory posunu
§12.11 by měly být znovu zadány takto:
- 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.
To znamená, že omezení, že první operand je třída nebo struktura obsahující deklaraci operátoru zůstává.
Omezení, že druhý operand musí být int
, je odebráno.
Binární operátory
§14.10.3 by měly být přepracovány takto:
-* 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.
To znamená, že omezení, že první parametr musí být T
nebo T?
, stále zůstává.
Zatímco omezení, že druhý operand musí být int
nebo int?
je odebrán.
Rozlišení přetížení binárního operátoru
První odrážka na §11.4.5 by měla být přepracována takto:
- Určuje se sada kandidátských uživatelem definovaných operátorů poskytovaných
X
aY
pro operaci,operator op(x,y)
. Sada se skládá ze sjednocení kandidátských operátorů poskytovanýchX
a , pokud operátor není operátor směny, kandidátské operátory poskytovanéY
, každý z nich je určen pomocí pravidel kandidátských uživatelsky definovaných operátorů §11.4.6. Pokud jsouX
aY
stejného typu, nebo pokud jsouX
aY
odvozeny od společného základního typu, pak se sdílené kandidátské operátory vyskytují v kombinované sadě pouze jednou.
To znamená, že pro operátory směn jsou kandidátské operátory pouze operátory poskytované typem X
.
Nevýhody
Uživatelé budou moct definovat operátory, které nedodržují doporučené pokyny, jako je implementace cout << "string"
v jazyce C#.
Alternativy
Obecná matematická rozhraní vystavená knihovnami by místo toho mohla vystavit explicitně pojmenované metody. To může ztížit čtení a údržbu kódu.
Obecná matematická rozhraní mohou vyžadovat, aby posun zahrnoval int
a aby byl proveden převod.
Tento převod může být nákladný, nebo dokonce nemožný, v závislosti na příslušném typu.
Nevyřešené otázky
Jedná se o obavu ohledně zachování "záměru", proč byl druhý operand omezen na int
?
Schůzky o designu
https://github.com/dotnet/csharplang/blob/main/meetings/2022/LDM-2022-02-09.md
C# feature specifications