Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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
XenYvoor de bewerkingoperator op(x,y)wordt bepaald. De set bestaat uit de samenvoeging van de kandidaat-operators die doorXen worden verstrekt, tenzij de operator een dienstoperator is, de kandidaat-operators die doorYworden verstrekt, die elk worden bepaald volgens de regels van door de gebruiker gedefinieerde kandidaatoperators §11.4.6. AlsXenYhetzelfde type zijn, of alsXenYzijn 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
C# feature specifications