2009-06-24 10 views
49

Sé que puede sobrecargar un operador existente. Quiero saber si es posible crear un nuevo operador. Aquí está mi escenario.¿Es posible crear un nuevo operador en C#?

quiero esto:

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

para que sea equivalente a esto:

var x = y <? z; 

En otras palabras, me gustaría crear mi propia <? operador.

+0

ningún lenguaje tiene esta capacidad ... – AminM

+7

@JesonPark - No es cierto. F # lo tiene como otros lo han señalado, y [C++ también lo tiene.] (Http: // stackoverflow.com/questions/1515399/can-you-make-custom-operators-in-c) [CoffeeScript] (http://coffeescript.org/) ofrece varios operadores nuevos como azúcar sintáctico para los modismos de JavaScript, y es tan personalizable que podría describirlo como permitir operadores personalizados. El último es un poco complicado, ya que técnicamente extenderías el idioma. –

+0

@JustinMorgan: como se menciona en el artículo de CodeProject _ "C++ admite la sobrecarga del operador, pero no está permitido crear sus propios operadores" _ esta es una emulación !! – AminM

Respuesta

33

No, no es posible. Debería crear un método en su lugar

27

No, pero puede sobrecargar some existing operators en C#.

En algunos otros lenguajes, como C#, puede utilizar:

let (<?) = min 
+4

En realidad, esto debería ser mínimo , no max;) –

17

Como las otras respuestas han dicho, no se puede crear un nuevo operador - al menos, no sin alterar el léxico y el analizador que están integrados en el compilador. Básicamente, el compilador está diseñado para reconocer que un personaje individual como < o ?, o un par como >> o <=, es un operador y lo trata especialmente; sabe que i<5 es una expresión en lugar de un nombre de variable, por ejemplo. Reconocer a un operador como operador es un proceso separado de decidir qué hace realmente el operador y está mucho más integrado en el compilador, por lo que puede personalizar el último pero no el primero.

Para los idiomas que tienen un compilador de fuente abierta (como GCC), en teoría, podría modificar el compilador para reconocer un nuevo operador. Pero no sería particularmente fácil, y además, todos necesitarían su compilador personalizado para usar su código.

+0

En aras de la claridad, en C++ las personas usan macros para hacer cosas como esta? No sé C++, solo preguntando. –

+0

o simplemente use idiomas donde los operadores son métodos infija, como scala o f # –

5

No solo no puedes hacer eso, pero ¿por qué querrías?

no estoy seguro de qué tipo es el Y y Z son, pero si son de un tipo de valor numérico, que probablemente se podría usar:

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

Aunque personalmente, todavía prefieren:

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

Pero soy un poco exigente? : junky

El código bueno no solo es ajustado y eficiente, sino también legible. Incluso si usted es el único que lo está leyendo, usted volvería a ese operador <? un día y se preguntará qué diablos hizo.

+2

No si se trata de una función conocida en otro idioma como esta pregunta: http://stackoverflow.com/questions/523403/can-i-define-a- perl-like-binding-operator-in-c –

+0

Lo mismo puede decirse de cualquier sobrecarga del operador – JNF

+5

No estoy de acuerdo. Creo que la sobrecarga del operador tiene sentido en muchos casos. Por ejemplo, si tiene sentido agregar dos instancias de un tipo, es posible que desee sobrecargar el operador + en lugar de crear un método .Add(). Intuitivamente, alguien ve "+" y entienden que el operador agrega aritméticamente las dos cosas. Si eso es lo que efectivamente está haciendo la sobrecarga, entonces es fácil de entender. –

2

No, pero puede crear métodos de extensión en lugar de esta

y.MethodName(z) 
+14

2.GetMin (1) es raro – Dario

+5

2.IfNotSmallEnoughThen (1) :) –

+0

Tengo true.Xor (falso) aquí ... :( – SparK

-3

se puede tratar de sobrecargar otro operador como % o + para actuar como operador <?.

va a ser divertido

+1

Esto no es una respuesta a esta pregunta. –

Cuestiones relacionadas