46 votes

Possible de remplacer l'opérateur de coalescence nulle?

Est-il possible de remplacer le null-coalescence de l'opérateur pour une classe en C#?

Dire par exemple: je veux retourner une valeur par défaut si une instance est nulle et de retour de l'instance si elle ne l'est pas. Le code devrait ressembler à quelque chose comme ceci:

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

Mais que faire si je souhaite utiliser le null-coalescence de l'opérateur de vérifier également si le MyClass.Mavaleur est réglé?

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

31voto

Simon Points 9025

Bonne question! Il n'est pas répertorié d'une manière ou d'une autre dans la liste des opérateurs surchargeables et non surchargeables et rien n'est mentionné sur la page de l'opérateur .

J'ai donc essayé ce qui suit:

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

et j'obtiens l'erreur "L'opérateur binaire surchargeable attendu". Donc, je dirais que la réponse est, à partir de .NET 3.5, un non.

15voto

Pete OHanlon Points 7234

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é
  • Nouveau
  • Type de
  • comme
  • est

7voto

Mehrdad Afshari Points 204872

Réponse simple: non

Les principes de conception en C # ne permettent pas à l'opérateur de surcharger qui change la sémantique du langage. Par conséquent, les opérateurs complexes tels que l'affectation composée, l'opérateur ternaire et ... ne peuvent pas être surchargés.

2voto

Robert Levy Points 18154

Ce qui est répandu pour être une partie de la prochaine version de C#. À partir de http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated

7. Monadique null vérification

Supprime la nécessité de vérifier les valeurs null avant d'accéder à des propriétés ou des méthodes. Connu comme la Sécurité de la Navigation de l'Opérateur en 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;

-3voto

soniiic Points 1713

Si quelqu'un est ici à la recherche d'une solution, l'exemple le plus proche serait de le faire

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X