Partager via


Configuration requise pour l’opérateur de décalage

Remarque

Cet article est une spécification de fonctionnalité. La spécification sert de document de conception pour la fonctionnalité. Elle inclut les changements de spécification proposés, ainsi que les informations nécessaires à la conception et au développement de la fonctionnalité. Ces articles sont publiés jusqu'à ce que les changements proposés soient finalisés et incorporés dans la spécification ECMA actuelle.

Il peut y avoir des divergences entre la spécification de la fonctionnalité et l'implémentation réalisée. Ces différences sont capturées dans les notes de réunion de conception de langage (LDM) pertinentes .

Vous pouvez en savoir plus sur le processus d’adoption des speclets de fonctionnalités dans la norme de langage C# dans l’article sur les spécifications.

Problème de champion : https://github.com/dotnet/csharplang/issues/4666

Résumé

Les exigences de l’opérateur de décalage seront assouplies afin que l’opérande de droite ne soit plus limité à être intuniquement .

Motivation

Lorsque vous travaillez avec des types autres que int, il n’est pas rare que vous changez en utilisant le résultat d’un autre calcul, tel que le décalage basé sur le leading zero count. Le type naturel d’un élément semblable à un leading zero count est le même que le type d’entrée (TSelf) et, dans de nombreux cas, cela vous oblige à convertir ce résultat int avant de passer, même si ce résultat est déjà compris dans la plage.

Dans le contexte des interfaces mathématiques génériques, les bibliothèques planifient l’exposition, ce qui est potentiellement problématique, car le type n’est pas bien connu et donc la conversion int en peut ne pas être possible ou même bien définie.

Conception détaillée

Opérateurs de décalage

Le §12.11 doit être reformulé comme suit :

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

Autrement dit, la restriction que le premier opérande soit la classe ou le struct contenant la déclaration d’opérateur reste. Alors que la restriction que le deuxième opérande doit être int supprimée.

Opérateurs binaires

Le §14.10.3 doit être reformulé comme suit :

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

Autrement dit, la restriction que le premier paramètre soit T ou T? reste. Alors que la restriction que le deuxième opérande doit être int ou int? est supprimée.

Résolution de la surcharge des opérateurs binaires

Le premier point de puce au §11.4.5 doit être reformulé comme suit :

  • L’ensemble d’opérateurs définis par l’utilisateur candidats fournis par X et Y pour l’opération operator op(x,y) est déterminé. L’ensemble se compose de l’union des opérateurs candidats fournis par X et , sauf si l’opérateur est un opérateur de décalage, les opérateurs candidats fournis par Y, chacun déterminé à l’aide des règles des opérateurs définis par l’utilisateur candidat §11.4.6. Si X et Y sont du même type, ou si X et Y sont dérivés d’un type de base commun, les opérateurs candidats partagés se produisent uniquement dans le jeu combiné une seule fois.

Autrement dit, pour les opérateurs de décalage, les opérateurs candidats ne sont que ceux fournis par type X.

Inconvénients

Les utilisateurs pourront définir des opérateurs qui ne suivent pas les instructions recommandées, telles que l’implémentation cout << "string" en C#.

Alternatives

Les interfaces mathématiques génériques exposées par les bibliothèques peuvent exposer des méthodes nommées explicitement à la place. Cela peut rendre le code plus difficile à lire/gérer.

Les interfaces mathématiques génériques peuvent nécessiter la prise int de décalage et qu’une conversion soit effectuée. Cette conversion peut être coûteuse ou peut ne pas être possible en fonction du type en question.

Questions non résolues

Y a-t-il des préoccupations concernant la préservation de l'«intention » autour de la raison pour laquelle le deuxième opérande a été limité à int?

Concevoir des réunions

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