Delen via


Versoepeling van de vereisten voor shiftoperators

Notitie

Dit artikel is een functiespecificatie. De specificatie fungeert als het ontwerpdocument voor de functie. Het bevat voorgestelde specificatiewijzigingen, samen met informatie die nodig is tijdens het ontwerp en de ontwikkeling van de functie. Deze artikelen worden gepubliceerd totdat de voorgestelde specificaties zijn voltooid en opgenomen in de huidige ECMA-specificatie.

Er kunnen enkele verschillen zijn tussen de functiespecificatie en de voltooide implementatie. Deze verschillen worden vastgelegd in de relevante LDM-notities (Language Design Meeting).

Meer informatie over het proces voor het aannemen van functiespeclets in de C#-taalstandaard vindt u in het artikel over de specificaties.

Probleem met de kampioen: https://github.com/dotnet/csharplang/issues/4666

Samenvatting

De eisen van de ploegendienstoperator worden versoepeld, zodat de operand aan de rechterkant niet langer beperkt is tot alleen int.

Motivatie

Bij het werken met andere typen dan int, is het niet ongebruikelijk dat u verschuift met het resultaat van een andere berekening, zoals verschuiven op basis van de leading zero count. Het natuurlijke type van iets als een leading zero count is hetzelfde als het invoertype (TSelf) en in veel gevallen moet u dat resultaat converteren naar int voordat u overgaat, zelfs als dat resultaat al binnen het bereik valt.

Binnen de context van de algemene wiskundige interfaces, die de bibliotheken van plan zijn beschikbaar te stellen, kan dit problematisch zijn omdat het type niet goed bekend is, en dus de conversie naar int mogelijk niet haalbaar of zelfs goed gedefinieerd is.

Gedetailleerd ontwerp

Shift-operatoren

§12.11 moet als volgt worden gewijzigd:

- 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.

Dat wil zeggen, de beperking dat de eerste operand de klasse of struct blijft die de operatordeclaratie bevat. De beperking dat de tweede operand int moet zijn, is opgeheven.

Binaire operatoren

§14.10.3 moet als volgt worden gewijzigd:

-*  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.

Met andere woorden, de beperking dat de eerste parameter T of T? moet zijn, blijft van kracht. Hoewel de beperking dat de tweede operand int of int? moet zijn wordt opgeheven.

Oplossing voor overbelasting van binaire operator

Het eerste opsommingsteken bij §11.4.5 moet als volgt herschreven worden:

  • De set door de gebruiker gedefinieerde kandidaatoperators die worden geleverd door X en Y voor de bewerking operator op(x,y) wordt bepaald. De set bestaat uit de samenvoeging van de kandidaat-operators die door X en worden verstrekt, tenzij de operator een dienstoperator is, de kandidaat-operators die door Yworden verstrekt, die elk worden bepaald volgens de regels van door de gebruiker gedefinieerde kandidaatoperators §11.4.6. Als X en Y hetzelfde type zijn, of als X en Y zijn afgeleid van een gemeenschappelijk basistype, vinden gedeelde kandidaatoperators slechts één keer plaats in de gecombineerde set.

Voor shiftoperators zijn kandidaatoperators alleen die van het type X.

Nadelen

Gebruikers kunnen operators definiëren die niet voldoen aan de aanbevolen richtlijnen, zoals het implementeren van cout << "string" in C#.

Alternatieven

De algemene wiskundige interfaces die door de bibliotheken worden weergegeven, kunnen in plaats daarvan expliciet benoemde methoden beschikbaar maken. Hierdoor kan code moeilijker worden gelezen/onderhouden.

De algemene wiskundige interfaces kunnen vereisen dat de verschuiving int neemt en dat er een conversie wordt uitgevoerd. Deze conversie kan duur zijn of is mogelijk niet mogelijk, afhankelijk van het type in kwestie.

Niet-opgeloste vragen

Is er bezorgdheid over het behouden van de "intentie" rond waarom de tweede operand beperkt was tot int?

Ontwerpbijeenkomsten

https://github.com/dotnet/csharplang/blob/main/meetings/2022/LDM-2022-02-09.md