2008-12-08 6 views
36

Est-il possible de surcharger l'opérateur null-coalescing pour une classe en C#? Par exemple, je veux renvoyer une valeur par défaut si une instance est null et retourner l'instance si ce n'est pas le cas. Le code ressemblerait à quelque chose comme ceci:Possible de surcharger l'opérateur null-coalescent?

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

Mais si je voudrais utiliser l'opérateur null-coalescent pour vérifier également si le MyClass.MyValue est réglé?

Bien sûr, il n'y a pas vraiment besoin de cela (du moins je le pense) - donc avant de répondre "pourquoi voudriez-vous faire cela" - Je suis juste curieux de savoir si c'est possible.

+0

Patrik, une utilisation: Je voulais surcharger l'opérateur coalescent null de chaîne à considérer comme nulle vide. Que ce soit raisonnable ou autre, c'est une question différente. – ANeves

Répondre

29

Bonne question! Il n'est pas listé d'une façon ou d'une autre dans le list of overloadable and non-overloadable operators et rien n'est mentionné sur the operator's page.

J'ai donc essayé les éléments suivants:

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

et je reçois l'erreur « opérateur binaire surchargeable attendu ». Donc, je dirais que la réponse est, à partir de .NET 3.5, un non.

6

Réponse simple: Non

principes de conception C# ne permettent pas la surcharge d'opérateur que la sémantique du changement de la langue. Par conséquent, les opérateurs complexes tels que l'assignation composée, l'opérateur ternaire et ... ne peuvent pas être surchargés.

14

Selon la norme ECMA-334, il n'est pas possible de surcharger le ?? opérateur.

De même, vous ne pouvez pas surcharger les opérateurs suivants:

  • =
  • & &
  • ||
  • :
  • vérifié
  • décoché
  • nouvelle
  • typeof
  • comme
  • est
-2

Si quelqu'un est à la recherche ici pour trouver une solution, le plus proche exemple serait de faites-le

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

-1: il vous manque le point, vous pouvez déjà faire ce que vous proposez avec le code OP ... aussi s'il vous plaît lisez attentivement la question, il ne demande pas comment faire mais s'il est possible de surcharger l'opérateur de null-coalescing - ce qui, malheureusement, ne l'est pas. – ANeves

+0

Je comprends qu'il demandait de surcharger le ?? opérateur et j'ai lu les réponses en disant que c'était impossible. Par conséquent je fournissais juste une solution qui fonctionne avec le résultat attendu (accordé il n'utilise pas l'opérateur de ??) pour n'importe qui qui pourrait rencontrer cette page recherchant quelque chose qui fonctionne. – soniiic

+1

+1: parce que c'est pertinent ET il indique clairement que ce n'est pas une vraie réponse mais un exemple proche – Jaap

2

Cette rumeur fait partie de la prochaine version de C#. De http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated

7. Monadique null vérification

supprime le besoin de vérifier avant d'accéder à des propriétés des valeurs nulles ou méthodes. Connu comme l'opérateur Safe Navigation dans Groovy).

Avant

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

Après

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