名称“__o”在当前上下文中不存在
我刚刚安装了Visual Studio 2015,并打开了我正在开发的asp.net项目。 我收到许多错误(完全相同),如下所示:
错误CS0103名称“__o”在当前上下文中不存在
那么其实我没有任何名为__o的variables,代码就像一个魅力(错误是无效的),但困扰我的是,我无法看到当我的代码真的有一个错误,因为它在这个列表中的某处我应该检查整个清单。
我发现如果我selectBuild Only而不是Build + IntelliSense ,错误(与intellisense有关)将会消失。
更新1:原因
发生这种情况的原因是这样的代码:
<% if (true) { %> <%=1%> <% } %> <%=2%>
为了在devise时在<%=%>块中提供智能感知,ASP.NET生成一个临时__ovariables和语言(VB或C#)的赋值,然后为该variables提供智能感知。 当页面编译器看到第一个<%= …%>块时就完成了。 但是在这里,块在if里面,所以if在closures之后,variables超出了范围。 我们最终生成这样的东西:
if (true) { object @__o; @__o = 1; } @__o = 2;
解决方法是在页面的早期添加一个虚拟expression式。 例如<%=“”%>“。 这将不会呈现任何东西,并且会确保在任何可能的if(或其他范围)语句之前,将__o声明为Render方法中的顶层。
更新2:摆脱这个错误,而不会失去其他智能错误
点击错误列表面板左上angular的filterbutton,取消CS0103的错误代码: 名称'__o'在当前上下文中不存在 ,这些错误将不再显示,您仍然可以有其他智能错误和警告:
在阅读上面评论中给出的链接之后,事实certificate,如果阻塞,智能感知如何处理。
Mikhail Arkhipov在ASP.NET论坛上发布了一个解释和解决方法:
我们终于获得了可靠的回报,并确定了潜在的问题。 一个微不足道的repro看起来像这样:
<% if (true) { %> <%=1%> <% } %> <%=2%>
为了在devise时在
<%= %>
块中提供智能感知,ASP.NET生成一个临时__o
variables和语言(VB或C#)的赋值,然后为该variables提供智能感知。 当页面编译器看到第一个<%= ... %>
块时就完成了。 但是在这里,块在if
里面,所以if
closures之后,variables超出了范围。 我们最终生成这样的东西:if (true) { object @__o; @__o = 1; } @__o = 2;
解决方法是在页面的早期添加一个虚拟expression式。 例如
<%="" %>
。 这将不会呈现任何东西,并且会确保在任何可能的if
(或其他范围)语句之前,将__o
声明为Render方法中的顶层。
注意上面, 失败的答案实际上并没有造成太大的伤害,除了隐藏所有intellisense错误,这些错误在构build时都是已知的。
参考: http : //youku.io/questions/324366/asp-net-mvc-error-name-o-is-not-declared https://msdn.microsoft.com/en-us/library/t8zbaa6f.aspx
<%response.write(var)%>而不是<%= var%>移除错误而不声明__o为build议其他职位
对我来说,解决这个问题的核心是在页面的早期添加一个虚拟expression式。 例如<%=“”%>“。 查看这个链接进一步的解释: 在这里input链接描述
在代码中声明variables__o,如下所示:
public object __o;
一定要把它放在母版页 ( 如果你正在使用 )。