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 si il est possible de créer un nouvel opérateur. Voici mon scénario.
Ce que je veux c':
var x = (y < z) ? y : z;
Être équivalent à ceci:
var x = y <? z;
En d'autres termes, je voudrais créer mon propre <?
opérateur.
- pas de langue de Cette fonctionnalité...
- Pas vrai. F# a elle comme d'autres l'ont souligné, et C++ a aussi. CoffeeScript propose plusieurs nouveaux opérateurs de sucre syntaxique pour JavaScript, des idiomes, et c'est tellement personnalisable que l'on pourrait décrire comme permettant la personnalisation des opérateurs. Le dernier est un peu délicat, car vous auriez du être techniquement l'extension de la langue.
- comme mentionné dans CodeProject l'article "C++ prend en charge la surcharge d'opérateur, mais vous n'êtes pas autorisé à créer votre propre des opérateurs" c'est de l'émulation!!
- Je ne vois pas l'article dont vous parlez, mais la exemple à partir de la roue dentée de la réponse (sur la question, je me suis lié d') résultats dans le code qui fonctionne exactement comme les exploitants. Si oui ou non ils sont cuits dans la langue, vous pouvez les faire travailler. De toute façon, votre déclaration (qu'aucune langue n'a cette capacité) n'est pas valide pour F#.
- En Scala, il serait
implicit class <?(y: Int) { def <?(z: Int) = y min z }
-- l'implicite de la classe pour ajouter une méthode àInt
, puis la méthode elle-même. Cette méthode ne fonctionne pas car<?
est un xml-start mot-clé. - Je parle de This Artical
- Même si c'était possible, je ne pense pas que ce serait une bonne idée. C'est beaucoup moins lisible qu'une méthode, par exemple
Min(y, z)
. - Haskell est entièrement définie par l'utilisateur opérateurs autant que je sache.
- Overloadable Opérateurs (Guide de Programmation C#)
- J'aimerais également pour ce faire. Ce qui sur un opérateur d'attribuer
b
àa
mais seulement quanda
est déjà en manque une valeur. par exemplea ??= b;
ne Peut pas être fait avec autant d'élégance avec une méthode - Ruby a quelques astuces qui sorta vous permettent de faire cela: stackoverflow.com/questions/11874579/...
Vous devez vous connecter pour publier un commentaire.
Non, il n'est pas possible. Vous devez créer une méthode plutôt
Non, mais vous pouvez surcharge certains opérateurs existants en C#.
Dans quelques autres langues, comme F#, vous pouvez utiliser:
Que les autres réponses ont dit, vous ne pouvez pas créer un nouvel opérateur - au moins, pas sans en altérer l'analyseur lexical et l'analyseur qui sont intégrées dans le compilateur. Fondamentalement, le compilateur est construit à reconnaître qu'un caractère individuel comme
<
ou?
, ou une paire comme>>
ou<=
, est un opérateur et à la traiter spécialement; il sait quei<5
est une expression plutôt qu'un nom de variable, par exemple. La reconnaissance de l'opérateur l'opérateur est un processus distinct de décider ce que l'opérateur ne fait, et il est beaucoup plus étroitement intégrée dans le compilateur, c'est pourquoi vous pouvez personnaliser le second mais pas le premier.Pour les langues qui ont un open-source compilateur (comme GCC), vous pouvez, en théorie, de modifier le compilateur de reconnaître un nouvel opérateur. Mais il ne serait pas particulièrement facile, et d'ailleurs, tout le monde aurait besoin de votre compilateur personnalisé pour l'utilisation de votre code.
Non seulement pouvez-vous ne pas le faire, mais pourquoi voudriez-vous?
Je ne suis pas sûr de ce type de votre y et z sont, mais si elles sont d'une valeur numérique de type, vous pourriez probablement utiliser:
Bien que personnellement, je préfère encore:
Mais je suis un peu une ? : junky.
Bon code n'est pas juste serré et efficace, mais également lisible. Même si vous êtes le seul à jamais de le lire, vous souhaitez revenir à cette
<?
exploitant un jour et me demande ce que le diable qui l'a fait.====
de sorte que l'ensemble de mon équipe de dev sait que nous sommes à l'aide d'un substituée test pour cet objet spécifique. C'est tout, mais oui.. Tout ce que je voulais éviter, c'est à l'aide de méthodes si l'.. juste déconner.Non, mais vous pouvez créer des Méthodes d'Extension au lieu de cela
Je suis surpris que personne n'a indiqué
"order of operations"
.Lorsque le compilateur évalue une expression qu'il a à se préoccuper d'effectuer les opérations dans le bon ordre afin que
(1+2*3) = (2*3+1)
multiplication arrive toujours avant d'ajouter, à la même"level"
dans l'expression.Lorsque vous remplacez et l'opérateur, vous pouvez modifier ce que l'opérateur n', mais pas l'ordre dans lequel le compilateur va l'évaluer. Si vous avez créé un nouvel opérateur, il n'y a aucun moyen de dire au compilateur qu'afin de pouvoir l'évaluer par rapport aux autres. Donc si vous écrivez
x <? 2 + 5
Faire lax <? 2
d'abord, puis ajouter 5 ou effectuez-vous le plus en premier et ensuite fairex <? 7
.vous pouvez essayer de surcharger les autres opérateur comme
%
ou+
à agir comme un<?
opérateur.Sera amusant