web-dev-qa-db-fra.com

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 ceci:

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

Pour être équivalent à ceci:

var x = y <? z;

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

59
Aaron Palmer

Non ce n'est pas possible. Vous auriez besoin de créer une méthode à la place

39
AgileJon

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

Dans d'autres langages, comme F #, vous pouvez utiliser:

let (<?) = min
31
Dario

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 qui sont intégrés au compilateur. Fondamentalement, le compilateur est conçu pour reconnaître qu'un caractère individuel comme < ou ?, ou une paire comme >> ou <=, est un opérateur et de 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 fait réellement l'opérateur, et est beaucoup plus étroitement intégré au compilateur - c'est pourquoi vous pouvez personnaliser ce dernier mais pas le premier.

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

17
David Z

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

Je ne sais pas quel type sont 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ère toujours:

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

Mais je suis un peu un? : junky.

Un bon code n'est pas seulement serré et efficace, mais aussi lisible. Même si vous êtes le seul à l'avoir lu, vous y reviendrez <? opérateur un jour et me demande ce que diable cela a fait.

5
Paul Hooper

Non, mais vous pouvez créer des méthodes d'extension au lieu de cela

y.MethodName(z)
5
Rony

Je suis surpris que personne n'ait mentionné "order of operations".

Lorsque le compilateur évalue une expression, il doit se préoccuper d'exécuter les opérations dans le bon ordre afin que la multiplication (1+2*3) = (2*3+1) Se produise toujours avant l'addition au même "level" Dans l'expression.

Lorsque vous remplacez et opérateur, vous pouvez modifier ce que fait l'opérateur, mais pas l'ordre dans lequel le compilateur l'évaluera. Si vous avez créé un nouvel opérateur, il n'y a aucun moyen de dire au compilateur dans quel ordre l'évaluer par rapport aux autres. Donc si vous écrivez x <? 2 + 5 Effectuez-vous d'abord le x <? 2 Puis ajoutez 5 ou effectuez-vous l'addition en premier et ensuite faites x <? 7.

2
Jeff