Pourquoi ne peut-on pas définir une variable dans une instruction if?
Peut-être cette question a été répondu avant, mais le mot if
se produit si souvent, il est difficile d'en trouver.
L'exemple n'a pas de sens (l'expression est toujours vrai), mais il illustre ma question.
Pourquoi est-ce code valide:
StringBuilder sb;
if ((sb = new StringBuilder("test")) != null) {
Console.WriteLine(sb);
}
Mais ce code n'est pas:
if ((StringBuilder sb = new StringBuilder("test")) != null) {
Console.WriteLine(sb);
}
J'ai trouvé une question similaire concernant un while
déclaration. La accepté de répondre, il dit que, dans un while
déclaration, il serait dire que la variable est définie dans chaque boucle. Mais pour ma if
déclaration exemple, qui n'est pas le cas.
Quelle est donc la raison pour laquelle nous ne sommes pas autorisés à le faire?
- La déclaration de la Variable est une instruction. Les Conditions l'exigent, une expression qui a une valeur, quelque chose que les déclarations ne sont pas et n'ont pas.
- Jeff est sur place. Lire sur les liens suivants. Déclarations: msdn.microsoft.com/en-us/library/ms173143(v=VS.100).aspx les Expressions: msdn.microsoft.com/en-us/library/ms173144(v=VS.100).aspx
- eh bien, alors changer le spec-à-dire qu'une déclaration de variable peut être utilisée comme une expression. Ce n'est pas une raison fondamentale pour laquelle cela ne peut pas être. C++ est-il juste comme ça.
- Qui est presque arrivé en C#6, mais a été tiré jusqu'à ce que j'ai compris en faveur de la construction d'une meilleure spécification pour une utilisation avec le pattern matching. Cela va changer dans une prochaine version de C#, mais pas possible dans les versions actuelles.
- Voir stackoverflow.com/questions/33180221/... pourquoi cela a été abandonnée pour C# 6
Vous devez vous connecter pour publier un commentaire.
C'est parce que la section 8.5.1 du langage C# spec. membres:
Cela signifie que, lorsque vous faites:
Vous êtes, en effet, de faire exactement la même chose que:
En tant que tel, il n'est plus une valeur de retour pour votre chèque à l'encontre de
!= null
, comme l'affectation n'est pas une expression unique, mais plutôt une déclaration, qui est un local variable de demande de déclaration composé d'un identifiant suivie par une expression.La spécification du langage donne cet exemple, en précisant que cela:
Est exactement équivalent à:
Essayer C#7 du Pattern Matching.
À l'aide de votre exemple:
if
déclaration.if(var sb = F() ; sb != null)
comme dans le bon vieuxfor(var sb = ; sb!=null ;)
is var
est juste.. hilarant. C'est presque comme si quelqu'un spécialement conçu permisvar
l'inférence de type ici là pour çaCela a à voir avec la différence entre une déclaration et une expression. Une expression a une valeur, tandis qu'une déclaration n'est pas.
À l'aide de vos exemples, de l'avis de ces classifications:
Avis que seule la partie centrale est une expression.
Maintenant nous nous déplaçons sur votre instruction conditionnelle. La syntaxe d'utilisation de la non-opérateur = est
Donc sur les deux côtés de la
!=
vous besoin de quelque chose qui possède une valeur (ce qui est tout à fait logique). Ergo, vous ne pouvez pas avoir les déclarations sur chaque côté de l'opérateur. C'est pourquoi une version de votre code fonctionne, tandis que l'autre ne l'est pas.Au lieu de:
On pourrait aussi écrire:
Cette boucle for s'exécute une fois, si votre variable-il pas la valeur null. À la fin de la boucle, votre variable temporaire est définie sur null. La condition de la boucle, puis évalue à false, et de la prochaine instruction se poursuit après l'accolade fermante est exécuté. Exactement comme si votre déclaration prévu à l'origine.