名称“__ o”在当前上下文中不存在

我刚刚安装了 VisualStudio2015并打开了我的 ASP。我正在做的一个网络项目。我收到了许多错误(完全一样) ,如下所示:

错误 CS0103名称“ _ _ o”在当前上下文中不存在

实际上我没有任何名为“ _ _ o”的变量,代码的工作原理就像一个符号(错误是无效的) ,但是困扰我的是,我不能看到当我的代码真的有一个错误,因为它在这个列表中的某个地方,我应该检查整个列表。

enter image description here

45952 次浏览

我发现如果我选择 只建造而不是 构建 + 智能感知,那么与智能感知相关的错误就会消失。

enter image description here

更新1: 原因

发生这种情况的原因是,对于这样的代码:

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

为了在设计时在 <% =% > 块中提供智能感知,ASP.NET 生成临时 _ _ o 变量和语言(VB 或 C #)的赋值,然后为变量提供智能感知。这在页面编译器看到第一个 <% = ...% > 块时完成。但是这里,块在 if 中,所以在 if 关闭之后,变量就超出了作用域。我们最终产生了这样的东西:

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

解决办法是在页面的早期添加一个虚拟表达式。

<%=""%>

这将不会呈现任何内容,并且它将确保在 Render 方法中声明 _ _ o 为顶级,在任何潜在的 if (或其他范围)语句之前。

更新2: 在不丢失其他 IntelliSense 错误的情况下删除此错误

点击错误列表面板左上角的过滤器按钮,取消选中 CS0103,因为: 名称“ _ _ o”在当前上下文中不存在的错误代码将不再显示,你仍然可以有其他的 IntelliSense 错误和警告:

enter image description here

在阅读了上面的评论中给出的链接之后,我们发现这就是智能感知处理 if 块的方式。

Mikhail Arkhipov 在 ASP.NET 上发布了一个解释和解决方案 论坛:

我们终于获得了可靠的复制品,并找到了潜在的问题。一个微不足道的复制品看起来是这样的:

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

为了在设计时在 <%= %>块中提供智能感知,ASP.NET 生成对临时 __o变量和语言的赋值 (VB 或 C #)然后为变量提供智能感知 当页面编译器看到第一个 <%= ... %>块时完成 块位于 if内部,所以在 if关闭之后,变量就出去了 我们最终产生了这样的东西:

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

解决方法是在页面的早期添加一个虚拟表达式。例如 <%="" %>。这不会造成任何影响,它会确保 在 Render 方法中,__o被声明为顶级,在任何 潜在的 if(或其他范围)语句。

注意到以上,除了隐藏所有的智能感知错误外,失败的答案实际上并没有造成多大的伤害,这些错误在构建时就已经知道了。

参考文献: 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

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

对我来说,从根本上解决这个问题的方法是在页面的早期添加一个虚拟表达式。例如:。查看这个链接以获得进一步的解释: https://forums.asp.net/post/1263727.aspx

在代码中声明 variable _ _ o,如下所示:

public object __o;

一定要把它放在 主页(如果你正在使用的话)。

我以前的 ASP.net MVC 项目把这个放在我的主页的顶部,它至少在一个 <% = “”% > 没有帮助的情况下起到了作用:

<script runat="server" type="text/C#">
public object __o;
</script>