web-dev-qa-db-fra.com

Le nom '__o' n'existe pas dans le contexte actuel

Je viens d'installer Visual Studio 2015 et j'ai ouvert mon projet asp .net sur lequel je travaillais. Je reçois beaucoup d'erreurs (toutes exactement les mêmes) que ci-dessous:

Erreur CS0103 Le nom '__o' n'existe pas dans le contexte actuel

En fait, je n'ai aucune variable nommée __o et le code fonctionne comme un charme (l'erreur est invalide), mais ce qui me dérange, c'est que je ne suis pas en mesure de voir quand mon code comporte réellement une erreur car il figure quelque part dans cette liste. et je devrais vérifier toute la liste.

enter image description here

49

J'ai découvert que si je choisissais Construire uniquement au lieu de Construire + IntelliSense les erreurs (liées à IntelliSense) disparaîtront.

enter image description here

Mise à jour 1: la raison

La raison en est que, pour des codes comme celui-ci:

<% if (true) { %>
    <%=1%>
<% } %>
<%=2%>

Afin de fournir IntelliSense en blocs <% =%> au moment de la conception, ASP.NET génère une affectation à une variable et à un langage temporaires __o (VB ou C #), puis fournit IntelliSense pour la variable. Cela est fait lorsque le compilateur de page voit le premier bloc <% = ...%>. Mais ici, le bloc est dans le if, donc après la fermeture du if, la variable sort de la portée. Nous finissons par générer quelque chose comme ceci:

if (true) { 
    object @__o;
    @__o = 1;
}
@__o = 2;

La solution consiste à ajouter une expression fictive au début de la page. Par exemple. <% = ""%>. Cela ne rendra rien et garantira que __o est déclaré niveau supérieur dans la méthode Render, avant toute instruction if (ou autre) de portée potentielle.

Mise à jour 2: Éliminer cette erreur sans perdre d'autres erreurs IntelliSense

Cliquez sur le bouton de filtrage dans le coin supérieur gauche du panneau de la liste d’erreurs et décochez la case CS0103 pour laquelle le code d’erreur correspondant à: Le nom '__o' n'existe pas dans le contexte actuel et ces erreurs ne seront plus affichées. Vous pouvez toujours avoir d'autres erreurs et avertissements IntelliSense:

enter image description here

96

Après avoir lu les liens donnés dans les commentaires ci-dessus, il s'avère que intellisense gère les blocages.

Mikhail Arkhipov a publié une explication et une solution de contournement dans les forums ASP.NET :

Nous avons finalement obtenu une repro fiable et identifié le problème sous-jacent. Une repro triviale ressemble à ceci:

<% if (true) { %>
    <%=1%>
<% } %>
<%=2%>

Afin de fournir intellisense en <%= %> blocs au moment de la conception, ASP.NET génère une affectation à un __o variable et langage (VB ou C #) fournissent alors l'intellisense pour la variable. Ceci est fait quand le compilateur de page voit le premier <%= ... %> bloc. Mais ici, le bloc est à l'intérieur de if, donc après la fermeture de if, la variable sort de la portée. Nous finissons par générer quelque chose comme ceci:

if (true) { 
    object @__o;
    @__o = 1;
}
@__o = 2;

La solution consiste à ajouter une expression fictive au début de la page. Par exemple. <%="" %>. Cela ne rendra rien et assurera que __o est déclaré niveau supérieur dans la méthode de rendu, avant toute instruction potentielle if (ou autre portée).

En notant ci-dessus, la réponse de Echec ne fait pas beaucoup de mal, si ce n'est de cacher toutes les erreurs intellisense, qui seraient de toute façon connues au moment de la construction.

Référence: http://youku.io/questions/324366/asp-net-mvc-error-name-o-is-not-declaredhttps://msdn.Microsoft. com/en-us/library/t8zbaa6f.aspx

28
Syakur Rahman

<% response.write (var)%> au lieu de <% = var%> supprime l'erreur sans déclarer __o comme suggéré, d'autres publications

http://forums.asp.net/p/923745/1266105.aspx

4
Omer K

Ce qui a résolu ce problème du fond du cœur pour moi, c’est d’ajouter une expression factice au début de la page. Par exemple. <% = ""%>. Consultez ce lien pour plus d'explications: entrez la description du lien ici

2
H. Grewal