Opérateurs ternaires en C #

Avec l’opérateur ternaire, il est possible de faire quelque chose comme ceci (en supposant que Func1 () et Func2 () renvoient un int:

int x = (x == y) ? Func1() : Func2(); 

Cependant, existe-t-il un moyen de faire la même chose sans renvoyer de valeur? Par exemple, quelque chose comme (en supposant que Func1 () et Func2 () renvoient void):

 (x == y) ? Func1() : Func2(); 

Je me rends compte que cela pourrait être accompli en utilisant une déclaration if, je me suis simplement demandé s’il y avait un moyen de le faire comme ceci.

Bizarre, mais tu pourrais faire

 class Program { private delegate void F(); static void Main(ssortingng[] args) { ((1 == 1) ? new F(f1) : new F(f2))(); } static void f1() { Console.WriteLine("1"); } static void f2() { Console.WriteLine("2"); } } 

Je ne pense pas. Autant que je m’en souvienne, l’opérateur ternaire est utilisé dans un contexte d’expression et non comme une déclaration. Le compilateur doit connaître le type de l’expression et void n’est pas vraiment un type.

Vous pouvez essayer de définir une fonction pour ceci:

 void iif(bool condition, Action a, Action b) { if (condition) a(); else b(); } 

Et ensuite, vous pourriez l’appeler comme ceci:

 iif(x > y, Func1, Func2); 

Mais cela ne rend pas vraiment votre code plus clair …

Si vous vous sentez en confiance, vous créerez une méthode statique dont le seul but est d’absorber l’expression et de la transformer en une déclaration.

 public static class Extension { public static void Do(this Object x) { } } 

De cette façon, vous pouvez appeler l’opérateur ternaire et appeler la méthode d’extension dessus.

 ((x == y) ? Func1() : Func2()).Do(); 

Ou, de manière presque équivalente, écrire une méthode statique (si la classe lorsque vous souhaitez utiliser ce “raccourci” est limitée).

 private static void Do(object item){ } 

… et l’appelant de cette façon

 Do((x == y) ? Func1() : Func2()); 

Cependant, je recommande vivement de ne pas utiliser ce “raccourci” pour les mêmes raisons déjà explicitées par les auteurs précédents.

Non, car l’opérateur ternaire est une expression, alors que les fonctions actions / void sont des instructions. Vous pourriez leur faire renvoyer un object , mais je pense qu’un bloc if / else rendrait l’intention beaucoup plus claire (les actions sont exécutées pour leurs effets secondaires au lieu de leurs valeurs).