2009-06-24 3 views
49

So che è possibile sovraccaricare un operatore esistente. Voglio sapere se è possibile creare un nuovo operatore. Ecco il mio scenario.È possibile creare un nuovo operatore in C#?

voglio che questo:

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

equivalente a questo:

var x = y <? z; 

In altre parole, mi piacerebbe creare il mio <? operatore.

+0

nessun linguaggio hanno questa capacità ... – AminM

+7

@JesonPark - Non è vero. F # ha come altri hanno sottolineato, e [C++ ha anche.] (Http: // StackOverflow.it/questions/1515399/can-you-make-custom-operators-in-c) [CoffeeScript] (http://coffeescript.org/) offre diversi nuovi operatori come zucchero sintattico per gli idiomi di JavaScript ed è così personalizzabile che tu potrebbe descriverlo come consentire operatori personalizzati. L'ultimo è un po 'complicato, visto che tecnicamente state estendendo la lingua. –

+0

@JustinMorgan: come menzionato nell'articolo CodeProject _ "C++ supporta l'overloading dell'operatore, ma non è consentito creare i propri operatori" _ questa è l'emulazione !! – AminM

risposta

33

No, non è possibile. Dovresti invece creare un metodo

27

No, ma puoi sovraccaricare some existing operators in C#.

In altri linguaggi, come C#, è possibile utilizzare:

let (<?) = min 
+4

In realtà, questo dovrebbe essere min , non max;) –

17

Come le altre risposte hanno detto, non si può creare un nuovo operatore - almeno, non senza alterare il lexer e parser sono integrati nel compilatore. Fondamentalmente, il compilatore è costruito per riconoscere che un singolo personaggio come < o ?, o una coppia come >> o <=, è un operatore e lo tratta in modo speciale; sa che i<5 è un'espressione piuttosto che un nome di variabile, ad esempio. Riconoscere un operatore come operatore è un processo separato dal decidere cosa fa realmente l'operatore, ed è molto più strettamente integrato nel compilatore - che è il motivo per cui è possibile personalizzare quest'ultimo ma non il primo.

Per le lingue che dispongono di un compilatore open source (come GCC), è possibile, in teoria, modificare il compilatore per riconoscere un nuovo operatore. Ma non sarebbe particolarmente facile, e inoltre, tutti avrebbero bisogno del tuo compilatore personalizzato per usare il tuo codice.

+0

Solo per motivi di chiarezza, in C++ le persone usano le macro per fare cose del genere? Non conosco il C++, solo chiedendo. –

+0

o usa solo le lingue in cui gli operatori sono metodi infissi, come scala o f # –

5

Non solo non puoi farlo, ma perché vorresti?

io non sono sicuro di quello che digitare il yez sono, ma se sono di un tipo di valore numerico, probabilmente si potrebbe usare:

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

Anche se personalmente, vorrei ancora preferiscono:

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

Ma io sono un po 'di un? : junky.

Il buon codice non è solo stretto ed efficiente, ma anche leggibile. Anche se sei l'unico a leggerlo, tornerai da quell'operatore <? un giorno e ti chiedi cosa diavolo abbia fatto.

+2

Non se è una funzione nota in un'altra lingua come questa domanda: http://stackoverflow.com/questions/523403/can-i-define-a- Perl-like-binding-operator-in-c –

+0

Lo stesso si può dire per qualsiasi operatore che sovraccarichi – JNF

+5

Non sono d'accordo. Penso che l'overloading dell'operatore abbia senso in molti casi. Ad esempio, se l'aggiunta di due istanze di un tipo ha senso, si potrebbe desiderare di sovraccaricare l'operatore + invece di creare un metodo .Add(). Intuitivamente, qualcuno vede "+" e capisce che l'operatore sta aritmeticamente aggiungendo le due cose insieme. Se questo è ciò che fa effettivamente il sovraccarico, allora è facilmente comprensibile. –

2

No, ma è possibile creare metodi di estensione al posto di questo

y.MethodName(z) 
+14

2.GetMin (1) è strano – Dario

+5

2.IfNotSmallEnoughThen (1) :) –

+0

Ho vero.Xo (falso) qui ... :( – SparK

-3

si può provare a sovraccaricare altro operatore come % o + di agire come operatore <?.

sarà divertente

+1

Questa non è una risposta alla sua domanda. –