question operator mark empty c# .net operator-overloading null-coalescing-operator

c# - mark - null coalescing operator javascript



Posible anular operador nulo-coalescente? (5)

¡Buena pregunta! No se enumera de una forma u otra en la lista de operadores que se pueden descargar ni descargar, y no se menciona nada en la página del operador .

Entonces intenté lo siguiente:

public class TestClass { public static TestClass operator ??(TestClass test1, TestClass test2) { return test1; } }

y obtengo el error "Espera operador binario esperado". Así que diría que la respuesta es, a partir de .NET 3.5, un no.

¿Es posible anular el operador de fusión nula para una clase en C #?

Digamos, por ejemplo, que quiero devolver un valor predeterminado si una instancia es nula y devolver la instancia si no es así. El código se vería así:

return instance ?? new MyClass("Default");

Pero, ¿qué sucede si quisiera utilizar el operador de fusión nula para verificar también si se ha configurado MyClass.MyValue?

Por supuesto, no hay una necesidad real de esto (al menos eso creo), así que antes de responder "¿por qué querrías hacer eso?", Solo tengo curiosidad si es posible .


Respuesta simple: no

Los principios de diseño de C # no permiten la sobrecarga del operador que cambia la semántica del lenguaje. Por lo tanto, operadores complejos como la asignación de compuestos, el operador ternario y ... no pueden sobrecargarse.


Si alguien está aquí buscando una solución, el ejemplo más cercano sería hacer esto

return instance.MyValue != null ? instance : new MyClass("Default");


De acuerdo con el estándar ECMA-334 , no es posible sobrecargar el ?? operador.

Del mismo modo, no puede sobrecargar los siguientes operadores:

  • =
  • &&
  • ||
  • ?:
  • comprobado
  • desenfrenado
  • nuevo
  • tipo de
  • como
  • es

Se rumorea que esto es parte de la próxima versión de C #. De http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated

7. Comprobación nula de Monadic

Elimina la necesidad de verificar nulos antes de acceder a propiedades o métodos. Conocido como el operador de navegación segura en Groovy).

antes de

if (points != null) { var next = points.FirstOrDefault(); if (next != null && next.X != null) return next.X; } return -1;

Después

var bestValue = points?.FirstOrDefault()?.X ?? -1;