2010-02-20 9 views
13

Duplicar posible:
Is it possible to create a new operator in c#?¿Definir nuevos operadores en C#?

Me encanta C#, pero una cosa me gustaría que había era la capacidad de definir mis propios operadores de clases, al igual que A => B en lugar de tener hacer A.Implies (B). Creo que sería genial si pudieras asignar un identificador de cualquier longitud en un conjunto como [+ - */&^|% $ # @> <] + a un método de clase y luego usarlo como un operador. ¿Alguien sabe si hay algún tipo de extensión, o si es posible hacer una, que hace esto?

Respuesta

10

Esto no está incorporado en el idioma. Tiene problemas para sobrecargar los operadores predefinidos que vienen con el idioma (overloadable operators).

Si le gusta ese estilo de depuración, es posible que desee considerar F#. Es un lenguaje funcional que se ejecuta en la parte superior del framework .NET y le brinda la posibilidad de definir cualquier operador que desee.

+5

Después de muchos años y proyectos en C++, tengo que estar totalmente en desacuerdo con el uso de la palabra "tristemente". –

+1

Eliminando la palabra con tristeza. Me he estado divirtiendo demasiado con F # y Ruby últimamente con su magia DSL en línea. – smaclell

0

En resumen, no. Tendría que mirar otro idioma. Puede sobrecargar muchos de los operadores existentes, o definir cualquier otro método (incluidos los métodos de extensión que son muy útiles), pero no puede definir operadores personalizados en ninguna variante de C# que yo sepa.

+0

Y existen restricciones sobre lo que puede hacer con los operadores existentes, p. si define '==' debe definir '! =', etc. y los tipos argumento/retorno no están totalmente abiertos en todos los casos. –

0

No, esto no es posible, a menos que haga su propio compilador tipo C#.

Solo puede reemplazar algunos de los operadores incorporados, no puede crear nuevos, y el operador lambda (=>) no puede anularse.

3

La lista de operadores que pueden estar sobrecargados es here.

La sobrecarga del operador solo le permite cambiar el comportamiento de los operadores, no definir los nuevos.

Y aunque A => B como A.Implies(B) puede sonar genial, le causará problemas más adelante (en 6 meses, cuando intente averiguar qué se supone que debe hacer su código).

+8

Con ese argumento, deberíamos usar 'a.Plus (b)' en caso de que olvidemos lo que '+' significa en aritmética o concatenación de cadenas. Si puede decidir el significado de un símbolo en un dominio y luego lo usa mucho, es * extremadamente * fácil recordar lo que significa. Si no vas a usarlo mucho, no vale la pena inventar el símbolo. Entonces en la práctica, esto no es un problema. –

+3

@Earwicker: No lo compro. '+' es universalmente entendido. Si bien '=>' puede tener todo el sentido del mundo para usted, si alguien más viene y tiene que mantener su código, es posible que no le resulte tan fácil darse cuenta o recordar lo que está sucediendo. –

+3

@David Brown: '+' significa la concatenación de cadenas en C#. No lo hace en VB.NET. Entonces no es universalmente entendido en todos sus significados. Está asumiendo que es mejor escribir el código para que una persona mal informada pueda leerlo lentamente; considere que puede ser mejor escribirlo para que una persona informada pueda leerlo rápidamente. Inmediatamente después de que salió C# 3, la mayoría de los programadores de C# no sabían qué significaba '=>' en una lambda.¿El equipo de C# estaba equivocado al usar ese símbolo? No, esperaban que la comunidad absorbiera el nuevo significado. Del mismo modo, una biblioteca que inventa sus propios símbolos sirve a una comunidad, y puede unirse a ella o no. –