29 votes

Qu'est-ce que ça veut dire? int i = (i = 20);

Je suis tombé sur cela en commençant à en apprendre davantage sur les vars ici:

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

Cependant, je n'ai aucune idée de la façon dont c'est une expression légale (elle l'est). Je pensais que vous ne pouviez pas attribuer à quelque chose en utilisant un a = (b = c) parce que (b = c) ne produit pas de valeur à attribuer?

Merci pour toute clarification à ce sujet.

31voto

Sean U Points 4476

Il est légal. De l' opérateur= C# de référence de la page:

L'opérateur d'affectation (=) stocke la valeur de sa main droite opérande dans l'emplacement de stockage, de propriété, ou d'indexation notée par sa gauche opérande et renvoie la valeur de son résultat.

(l'emphase est mienne)

Le code de l'exemple est artificiel (et inutile), mais il peut être utilisé dans d'autres cas, pour faire des choses utiles, de façon plus concise. Par exemple:

BinaryTree tree;
TreeNode node;
if((node = tree.FindNodeForKey(10)) != null)
{
    // do useful things with returned node
}

14voto

Leslie Points 1215

L'ensemble de la citation de MSDN est:

Les Variables déclarées à l'aide de var ne peut pas être utilisé dans l'expression d'initialisation. En d'autres termes, c'est l'expression juridique: int i = (i = 20); mais cette expression produit une erreur de compilation: var i = (i = 20);

Le point est que vous ne pouvez pas utiliser les variables déclarées par var dans l'expression d'initialisation. En d'autres termes, si vous utilisez var pour déclarer i, alors vous ne pouvez pas utiliser je de l'autre côté du signe=.

Comme d'autres l'ont noté, vous ne serait pas à l'écriture de ce code. C'est un exemple artificiel.

6voto

Chuck Savage Points 6106

J'utilise ce genre de chose tout le temps.

 public class Parameters
{
    public readonly bool ContainsSquareBrackets;

    public Parameters(string paras)
    {
        if(ContainsSquareBrackets = paras.Contains(']') || paras.Contains('['))
        {
             // do something ...
        }
    }
}
 

4voto

Kirk Woll Points 34601

Ce code est inutile. La cession de l'expression renvoie la valeur qui lui a été assigné. Par conséquent, le résultat de:

i = 20

Est, bien sûr, 20. Donc:

i = (i = 20);

Est le même que:

i = 20;

Parfois, le fait qu'une affectation renvoie quelque chose peut être utile, comme pour les boucles:

for (string line; (line = reader.ReadLine()) != null;) { ... }

(Pour ce que ça vaut, je ne voudrais pas utiliser ce langage dans cette situation particulière)

Ou d'affecter la même valeur à plusieurs variables:

int x, y;
x = y = 5;

Maintenant, les deux x et y valeur 5.

3voto

The Mask Points 5925

C'est légal en C# parce que l'ordre d'évaluation pour les opérateurs est de gauche à droite par défaut,à la différence des langages C/C++ qui ne définissent pas une limite au point de séquence.. L' = opérateur affecter la valeur de 20 et renvoie la valeur comme résultat. C'est analysée comme:

int i; //<- i is declared. 
i = 20; // assign 20 to i variable and returns.
i = i; // assign i as i value of.

C'est une expression ambiguë

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