2009-06-24 8 views
49

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.Est-il possible de créer un nouvel opérateur dans C#?

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

+0

pas de langue ont cette capacité ... – AminM

+7

@JesonPark - Pas vrai. F # l'a comme d'autres l'ont souligné, et [C++ l'a aussi bien.] (Http: // stackoverflow.com/questions/1515399/can-you-make-custom-opérateurs-in-c) [CoffeeScript] (http://coffeescript.org/) offre plusieurs nouveaux opérateurs comme sucre syntaxique pour les idiomes JavaScript, et il est tellement personnalisable que vous pourrait le décrire comme permettant des opérateurs personnalisés. Le dernier est un peu compliqué, puisque techniquement vous étendez la langue. –

+0

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

Répondre

33

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

27

Non, mais vous pouvez surcharger some existing operators en C#.

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

let (<?) = min 
+4

En fait, cela devrait être min , pas max;) –

17

Comme les autres réponses ont dit, vous ne pouvez pas créer un nouvel opérateur - du moins, pas sans altérer le lexer et analyseur qui sont construits dans le compilateur. Fondamentalement, le compilateur est construit 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 l'opérateur 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 (tel que GCC), vous pouvez, en théorie, modifier le compilateur pour reconnaître un nouvel opérateur. Mais ce ne serait pas particulièrement facile, et d'ailleurs, tout le monde aurait besoin de votre compilateur personnalisé pour utiliser votre code.

+0

Juste pour plus de clarté, en C++ les gens utilisent des macros pour faire des choses comme ça? Je ne connais pas le C++, je demande juste. –

+0

ou simplement utiliser des langues où les opérateurs sont des méthodes infix, comme scala ou f # –

5

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

Je ne suis pas sûr du type de votre y et z sont, mais si elles sont d'un type de valeur numérique, vous pouvez probablement utiliser:

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

Bien que personnellement, je serais toujours préférer:

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

Mais je suis un peu? : 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 reviendrez un jour à l'opérateur <? et vous vous demanderez ce que cela a fait.

+2

Pas si c'est une fonctionnalité connue dans une autre langue comme cette question pose: http://stackoverflow.com/questions/523403/can-i-define-a- perl-like-binding-operator-in-c –

+0

On peut dire la même chose pour toute surcharge de l'opérateur – JNF

+5

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'ajout 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 ils comprennent que l'opérateur ajoute arithmétiquement les deux choses ensemble. Si c'est ce que la surcharge fait effectivement, alors c'est facile à comprendre. –

2

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

y.MethodName(z) 
+14

2.GetMin (1) est bizarre – Dario

+5

2.IfNotSmallEnoughThen (1) :) –

+0

J'ai true.Xor (faux) ici ... :( – SparK

-3

vous pouvez essayer de surcharger un autre opérateur comme % ou + d'agir comme un opérateur <?.

sera amusant

+1

Ce n'est pas une réponse à sa question. –

Questions connexes