我发现如果我选择仅构建而不是构建+智能感知,那么与智能感知相关的错误将会消失。
更新1: 原因
造成这种情况发生的原因是:对于像这样的代码:
<% if (true) { %>
<%=1%>
<% } %>
<%=2%>
为了在设计时提供<%= %>块中的 IntelliSense,ASP.NET 会生成对临时 __o 变量的赋值,并且语言(VB 或 C#)会为该变量提供 IntelliSense。当页面编译器看到第一个<%= ... %> 块时就会执行此操作。但是,在这里,该块位于if内部,因此在if关闭后,变量将超出范围。我们最终生成类似以下内容:if (true) {
object @__o;
@__o = 1;
}
@__o = 2;
解决办法是在页面开头添加一个虚假表达式,例如:
The workaround is to add a dummy expression early in the page. E.g.
<%=""%>
这段代码不会渲染任何东西,并确保在渲染方法中,__o在任何可能的if语句(或其他作用域语句)之前被声明为顶级变量。
更新2:消除此错误而不失去其他智能感知错误
在错误列表面板的左上角单击筛选按钮,并取消选中CS0103,该错误代码是:名称“__o”在当前上下文中不存在,然后这些错误将不再显示,您仍然可以拥有其他智能感知错误和警告:
在阅读上面评论中提供的链接后,原来是与Intellisense如何处理if语句有关。
Mikhail Arkhipov 在ASP.NET论坛发表了一份解释和解决方法:
我们最终获得了可靠的复现,并确定了根本问题。一个简单的复现看起来像这样:
为了在设计时提供<% if (true) { %> <%=1%> <% } %> <%=2%>
<%= %>
块的智能感知,ASP.NET会生成一个临时的__o
变量并由语言(VB或C#)为该变量提供智能感知。当页面编译器看到第一个<%= ... %>
块时,就会执行这个操作。但是,在这里,该块位于if
中,所以在if
结束后,该变量将超出作用域。我们最终生成的代码类似于以下内容:解决方法是在页面早期添加一个虚拟表达式。例如:
if (true) { object @__o; @__o = 1; } @__o = 2;
<%="" %>
。这不会呈现任何内容,并确保在渲染方法中首先声明__o ,在任何潜在的
if (或其他作用域)语句之前。
注意上面提到的,Failure 的答案实际上并没有造成太大的伤害,除了隐藏所有智能感知错误,这些错误在构建时已经知道了。
参考资料:http://youku.io/questions/324366/asp-net-mvc-error-name-o-is-not-declaredhttps://msdn.microsoft.com/en-us/library/t8zbaa6f.aspx
在代码中声明变量__o,像这样:
public object __o;
<%="" %>
正常工作。 - Andy使用<% response.write(var) %>代替<% =var %>可以消除错误,而无需声明像其他帖子建议的__o。
<script runat="server" type="text/C#">
public object __o;
</script>