2008-12-08 27 views
36

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

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 algo como esto:

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

Pero lo que si me gustaría usar el operador nulo coalescencia para comprobar también si se establece el MyClass.MyValue?

Por supuesto que 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.

+0

Patrik, un uso: quería sobrecargar el operador nulo coalescencia de cadena vacía como para considerar nulo. Si eso es sensato o lo que sea, esa es una pregunta diferente. – ANeves

Respuesta

29

¡Buena pregunta! No aparece en una lista u otra en el list of overloadable and non-overloadable operators y no se menciona nada en the operator's page.

así que he intentado lo siguiente:

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

y me sale el error "operador binario sobrecargable espera". Así que diría que la respuesta es, a partir de .NET 3.5, un no.

6

Respuesta simple: No hay

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

14

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

Del mismo modo, no se puede sobrecargar los siguientes operadores:

  • =
  • & &
  • ||
  • :?
  • comprobado
  • sin control
  • nueva
  • typeof
  • como
  • es
-2

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

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

-1: te estás perdiendo el punto, ya puedes hacer lo que propones con el código de OP ... también lee la pregunta con cuidado, no está preguntando cómo hacerlo, pero si es posible sobrecargar al operador nulo-coalescente - que, lamentablemente, no lo es. – ANeves

+0

Entiendo que estaba preguntando sobre la sobrecarga del ?? operador y leí las respuestas diciendo que era imposible. Por lo tanto, solo estaba proporcionando una solución que funciona con el resultado esperado (siempre que no use el operador ??) para cualquier persona que pueda encontrar esta página buscando algo que funcione. – soniiic

+1

+1: porque es relevante Y establece claramente que no es una respuesta real sino un ejemplo cercano – Jaap

2

Se rumorea que esto forma 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 Monádica nula

Elimina la necesidad de comprobar si hay valores nulos antes de acceder a propiedades y métodos. Conocido como el operador de navegación segura en Groovy).

Antes

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; 
Cuestiones relacionadas