我刚刚安装了Visual Studio 2015并打开了我正在处理的asp .net项目。我收到了很多错误(完全相同),如下所示:
错误CS0103名称' __ o'在当前上下文中不存在
实际上,我没有任何名为__o的变量,而且代码就像魅力一样(错误无效)但令我困扰的是,我无法看到我的代码何时出现错误因为它在这个列表的某个地方,我应该检查整个列表。
答案 0 :(得分:92)
我发现,如果我选择仅构建而不是 Build + IntelliSense ,则错误(与IntelliSense相关)将会消失。
更新1:原因
发生这种情况的原因是对于这样的代码:
<% if (true) { %>
<%=1%>
<% } %>
<%=2%>
为了在&lt;%=%&gt;中提供IntelliSense在设计时阻止ASP.NET,生成临时__o变量和语言(VB或C#)的赋值,然后为变量提供IntelliSense。当页面编译器看到第一个&lt;%= ...%&gt;时,就会这样做。块。但是在这里,块在if中,所以在if关闭之后,变量超出了范围。我们最终会产生这样的结果:
if (true) {
object @__o;
@__o = 1;
}
@__o = 2;
解决方法是在页面的早期添加虚拟表达式。例如。 &LT;%=&#34;&#34; %取代。这不会呈现任何内容,并且它将确保在任何可能的if(或其他作用域)语句之前,在Render方法中将__o声明为顶级。
更新2:摆脱此错误而不会丢失其他IntelliSense错误
点击错误列表面板左上角的过滤器按钮,取消选中 CS0103 ,错误代码为:名称&#39; __ o&#39;在当前上下文中不存在,并且这些错误将不再显示,您仍然可以有其他IntelliSense错误和警告:
答案 1 :(得分:28)
在阅读上面评论中给出的链接之后,事实证明是intellisense处理if块的方式。
Mikhail Arkhipov在ASP.NET中发布了解释和解决方法 论坛:
我们终于获得了可靠的复制品并确定了潜在的问题。一个琐碎的复制品看起来像这样:
<% if (true) { %> <%=1%> <% } %> <%=2%>
为了在设计时在
<%= %>
块中提供intellisense,ASP.NET会生成对临时__o
变量和语言的赋值 (VB或C#)然后提供变量的intellisense。那是 页面编译器看到第一个<%= ... %>
块时完成。但在这里, block在if
内,所以在if
关闭后,变量就会消失 范围。我们最终会产生这样的结果:if (true) { object @__o; @__o = 1; } @__o = 2;
解决方法是在页面的早期添加虚拟表达式。例如。
<%="" %>
。这不会呈现任何东西,它将确保 在任何之前,__o
在Render方法中被声明为顶级 潜在的if
(或其他范围界定)声明。
在上面注意到,除了隐藏所有智能感知错误之外,Failure的答案实际上并没有太大的伤害,这在构建时无论如何都是已知的。
参考: http://youku.io/questions/324366/asp-net-mvc-error-name-o-is-not-declared https://msdn.microsoft.com/en-us/library/t8zbaa6f.aspx
答案 2 :(得分:4)
&lt;%response.write(var)%&gt;而不是&lt;%= var%&gt;删除错误 没有声明__o作为建议的其他帖子
答案 3 :(得分:1)
从我的心里解决这个问题的原因是在页面的早期添加了一个虚拟表达式。例如。 &LT;%=&#34;&#34; %取代。请查看此链接以获取进一步说明:enter link description here
答案 4 :(得分:-2)
在代码中声明变量__o,如下所示:
public object __o;
请务必将其放入母版页(,如果您使用的是)。