64 votes

Est-il possible de créer un nouvel opérateur en c# ?

Je sais que vous pouvez surcharger un opérateur existant. Je veux savoir s'il est possible de créer un nouvel opérateur. Voici mon scénario.

Je veux ça :

var x = (y < z) ? y : z;

Pour être équivalent à ceci :

var x = y <? z;

En d'autres termes, je voudrais créer ma propre <? opérateur.

0 votes

Aucune langue n'a cette capacité...

11 votes

@JesonPark - C'est faux. F# l'a comme d'autres l'ont souligné, et Le C++ l'a aussi. CoffeeScript offre plusieurs nouveaux opérateurs comme sucre syntaxique pour les idiomes JavaScript, et il est tellement personnalisable que vous pourriez le décrire comme autorisant les opérateurs personnalisés. Le dernier point est un peu délicat, car il s'agirait techniquement d'une extension du langage.

0 votes

@JustinMorgan : comme mentionné dans l'article de CodeProject "C++ supporte la surcharge des opérateurs, mais vous n'êtes pas autorisé à créer vos propres opérateurs". c'est de l'émulation !

42voto

AgileJon Points 20497

Non, ce n'est pas possible. Vous devez créer une méthode à la place

31voto

Dario Points 26259

Non, mais vous pouvez surcharger certains opérateurs existants en C#.

Dans certains autres langages, comme F#, vous pouvez utiliser :

let (<?) = min

5 votes

En fait, cela devrait être min, et non max ;)

19voto

David Z Points 49476

Comme les autres réponses l'ont dit, vous ne pouvez pas créer un nouvel opérateur - du moins, pas sans modifier le lexer et l'analyseur syntaxique qui sont intégrés dans le compilateur. Fondamentalement, le compilateur est construit pour reconnaître qu'un caractère individuel comme < o ? ou une paire comme >> o <= est un opérateur et qu'il faut le traiter spécialement ; il sait que i<5 est une expression plutôt qu'un nom de variable, par exemple. Reconnaître un opérateur en tant qu'opérateur est un processus distinct de la décision de ce que l'opérateur fait réellement, et est beaucoup plus étroitement intégré dans le compilateur - c'est pourquoi vous pouvez personnaliser ce dernier mais pas le premier.

Pour les langages qui ont un compilateur open-source (comme GCC), vous pourriez, en théorie, modifier le compilateur pour reconnaître un nouvel opérateur. Mais ce ne serait pas particulièrement facile, et de plus, tout le monde aurait besoin de votre compilateur personnalisé pour utiliser votre code.

0 votes

Par souci de clarté, en C++, les gens utilisent des macros pour faire ce genre de choses ? Je ne connais pas le C++, je demande simplement.

0 votes

Ou simplement utiliser des langages où les opérateurs sont des méthodes infixes, comme scala ou f#.

8voto

Paul Hooper Points 518

Non seulement vous ne pouvez pas le faire, mais pourquoi le voudriez-vous ?

Je ne suis pas sûr du type de vos y et z, mais s'ils sont de type valeur numérique, vous pourriez probablement utiliser :

var x = Math.Min(y, z);

Bien que personnellement, je préférerais encore :

var x = (y < z) ? y : z;

Mais je suis un peu un junkie.

Un bon code n'est pas seulement rigoureux et efficace, mais aussi lisible. Même si vous êtes la seule personne à le lire, vous reviendrez à cela <? opérateur un jour et se demander ce que ça a bien pu faire.

2 votes

Pas s'il s'agit d'une fonctionnalité connue dans un autre langage comme le demande cette question : stackoverflow.com/questions/523403/

1 votes

On peut dire la même chose pour tout opérateur surchargeant

8 votes

Je ne suis pas d'accord. Je pense que la surcharge des opérateurs a du sens dans de nombreux cas. Par exemple, si l'addition de deux instances d'un type a du sens, vous pouvez surcharger l'opérateur + au lieu de créer une méthode .Add(). Intuitivement, quelqu'un voit "+" et comprend que l'opérateur additionne arithmétiquement les deux choses ensemble. Si c'est ce que fait effectivement la surcharge, alors elle est facilement compréhensible.

5voto

Rony Points 6340

Non, mais vous pouvez créer des méthodes d'extension à la place de ceci

y.MethodName(z)

7 votes

2.IfNotSmallEnoughThen(1) :)

0 votes

J'ai true.Xor(false) ici... :(

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X