2010-10-13 4 views
9

Je pense que je me souviens avoir vu quelque chose de similaire au ?: ternary operator en C# qui ne comportait que deux parties et renverrait la valeur de la variable si elle n'était pas nulle et une valeur par défaut si c'était le cas. Quelque chose comme ceci:Opérateur de coalescence en C#?

tb_MyTextBox.Text = o.Member ??SOME OPERATOR HERE?? "default"; 

Fondamentalement, l'équivalent de ceci:

tb_MyTextBox.Text = o.Member != null ? o.Member : "default"; 

Est-ce qu'une telle chose existe ou ai-je imaginer voir juste cela quelque part?

+1

Copie possible -> http: // stackoverflow.com/questions/463155/how-does-the-ternary-operator-work –

+3

@Junior mais c'est à propos de l'opérateur ternaire alors qu'il s'agit de l'opérateur de coalescence (malgré le titre) – Rup

+1

@Junior, alors que le titre de ma question est un peu trompeur si vous lisez ma question, vous verrez que cela n'a rien à voir avec le doublon que vous avez suggéré. –

Répondre

3

drôle vous utilisé "?? SOME OPÉRATEUR ICI ??", comme l'opérateur que vous cherchez est "??", à savoir:

tb_MyTextBox.Text = o.Member ?? "default"; 

http://msdn.microsoft.com/en-us/library/ms173224.aspx

+1

Hé, ça a dû être mon subconscient. Je savais que je l'avais vu quelque part. –

17

Eh bien, ce n'est pas tout à fait la même chose que le conditional operator, mais je pense que vous pensez de la null coalescing operator (??). (Je suppose que vous avez dit qu'il était "similaire" :) Notez que "ternaire" se réfère simplement au nombre d'opérandes que l'opérateur est - donc si l'opérateur conditionnel est un opérateur ternaire, l'opérateur de coalescence nul est un opérateur binaire.

Il prend généralement la forme suivante:

result = first ?? second; 

ici second ne sera évaluée que si first est nulle. Il ne doit pas être la cible d'une affectation - vous pouvez l'utiliser pour évaluer un argument de méthode, par exemple.

Notez que le premier opérande a la valeur pour être nullable - mais le second ne l'est pas. Bien qu'il existe des détails spécifiques sur les conversions, dans le cas simple, le type de l'expression globale est le type du deuxième opérande. En raison de l'associativité, vous pouvez empiler les utilisations de l'opérateur proprement aussi:

int? x = GetValueForX(); 
int? y = GetValueForY(); 
int z = GetValueForZ(); 

int result = x ?? y ?? z; 

Notez comment x et y sont annulable, mais z et result ne sont pas. Bien sûr, z pourrait être nul, mais alors result devrait également être nul.

Fondamentalement, les opérandes seront évalués dans l'ordre où ils apparaissent dans le code, avec l'évaluation s'arrêtant quand il trouve une valeur non nulle.

Oh, et bien que ce qui précède soit indiqué en termes de types de valeur, il fonctionne également avec les types de référence (qui sont toujours).