2014-08-29 5 views
0

pourquoi je ne peux pas avoir quelque chose comme:Expression attendue: l'opérateur

Some_Function ? myList.Add(a) : throw new Exception(); 

Pourquoi ne puis-je jeter exception en partie d'autre de l'opérateur?:? quel est le but principal de?: operator?

Suggestion Si quelqu'un d'autre se demandait la même chose, à côté de la lecture des réponses ci-dessous, je vous suggère de lire ce post ainsi .. Expression Versus Statement

+2

Parce que c'est C#, pas C++. – Athari

+2

Parce que les deux côtés doivent renvoyer une valeur du même type, vous pouvez faire ce que vous voulez avec if/else. –

+1

'List.Add' est une méthode void, donc' myList.Add (a) 'n'est pas une expression. – Lee

Répondre

6

Les autres réponses et commentaires sont bien sûr vrais (nous pouvons nous référer au documentation), bien que ma compréhension de la question ressemble plutôt à «pourquoi cela doit-il être comme ça?

Selon le C# 5.0 specification, l'opérateur conditionnel constitue une expression , pas une déclaration . Je soupçonne que la raison pour laquelle ce n'est pas un déclaration, vous empêchant ainsi de faire quelque chose comme a ? b() : throw e est simplement parce que nous avons déjà une construction de déclaration pour atteindre fondamentalement la même chose; à savoir, if..else.

if (a) { b(); } else { throw e; } 

L'avantage du opérateur conditionnel est qu'il peut être utilisé dans des déclarations ou d'autres expressions.

bool? nb = GetValue(); 
if (nb ?? (a ? b() : c())) { throw e; } 
+0

+1 pour être la seule personne à faire la distinction assez importante que l'opérateur conditionnel nécessite 2 expressions et non déclarations. –

+1

@BenRobinson Il ne dit pas strictement cela, juste qu'il * forme * une expression ... (+1 pour référencer la spécification, cependant, c'est la seule véritable réponse à "pourquoi C# ne fait-il pas x?") – Rawling

+1

@Rawling, OK mais assez proche. –

2

Vous devez vous rappeler que l'opérateur doit retourner quelque chose ternaires et List.Add est une méthode void donc elle échoue. Les deux côtés doivent être compatibles et doivent retourner quelque chose.

Le MSDN dit:

La condition doit évaluer à vrai ou faux. Si la condition est vraie, première_expression est évaluée et devient le résultat. Si la condition est false, seconde_expression est évaluée et devient le résultat.

Et myList.Add(a) n'est pas une expression.

+3

Plus spécifiquement les deux choses qu'il peut retourner doivent être compatibles types –

+3

@HenkHolterman non, conversions implicites seront appliquées, documentation mention à ce sujet –

3

Parce qu'il est défini comme:

null-coalescing-expression ? expression : expression 

Comme vous pouvez le lire dans ?: Operator (C# Reference):

L'opérateur conditionnel (:) retours une des deux valeurs en fonction la valeur d'une expression booléenne.

L'un des deux expression est évaluée en fonction de la valeur booléenne de null-coalescent-expression.

Puisqu'aucun de vos deux fragments de code n'est expressions that evaluate to a value (List.Add() est void et qu'une exception n'évalue pas non plus à une valeur), cela ne peut pas compiler.

1

Voir ?: Operator on MSDN. C'est clairement expliqué là-bas.

L'opérateur conditionnel (? :) renvoie l'une des deux valeurs en fonction de la valeur d'une expression booléenne. Voici la syntaxe de l'opérateur conditionnel.

condition? first_expression: second_expression;

La condition doit être vraie ou fausse. Si la condition est vraie, first_expression est évalué et devient le résultat. Si la condition est fausse, seconde_expression est évaluée et devient le résultat. Une seule des deux expressions est évaluée. Le type de first_expression et second_expression doit être le même ou une conversion implicite doit exister d'un type à l'autre. Vous pouvez exprimer des calculs qui pourraient nécessiter une construction if-else de manière plus concise en utilisant l'opérateur conditionnel. Par exemple, le code suivant utilise d'abord une instruction if puis un opérateur conditionnel pour classer un entier comme positif ou négatif.

L'opérateur conditionnel (? :) renvoie l'une des deux valeurs en fonction de la valeur d'une expression booléenne. Voici la syntaxe de l'opérateur conditionnel.

La condition doit être vraie ou fausse. Si la condition est vraie, first_expression est évalué et devient le résultat. Si la condition est fausse, seconde_expression est évaluée et devient le résultat. Une seule des deux expressions est évaluée. Le type de first_expression et second_expression doit être le même ou une conversion implicite doit exister d'un type à l'autre. Vous pouvez exprimer des calculs qui pourraient nécessiter une construction if-else de manière plus concise en utilisant l'opérateur conditionnel. Par exemple, le code suivant utilise d'abord une instruction if puis un opérateur conditionnel pour classer un entier comme positif ou négatif.