当前上下文中不存在名称为 '__o' 的变量。

78

我刚刚安装了Visual Studio 2015并打开了我正在工作的asp .net项目。我收到了很多错误(全部完全相同)如下:

Error CS0103 当前上下文中不存在名称 '__o'。

其实我没有任何命名为 '__o' 的变量,代码运行得很好(错误是无效的),但令我困扰的是,当我的代码真正出现错误时,我无法看到它,因为它会出现在这个列表中,我需要检查整个列表。

输入图像描述


与__o相关的问题(https://dev59.com/I0fSa4cB1Zd3GeqPBfIS)。同时也可以尝试搜索解决方案。=/ - Speerian
6个回答

134

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

在此输入图片描述

更新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”在当前上下文中不存在,然后这些错误将不再显示,您仍然可以拥有其他智能感知错误和警告:

enter image description here


6
我也遇到了同样的问题。我可以隐藏IntelliSense错误,但那似乎只是掩盖问题。我想追踪这个问题。 - Dan
3
就像Dan所说,这并不是解决方法,只是掩盖了问题。此外,这还会隐藏所有的IntelliSense错误,而不仅仅是其中一个。 - Taurib
1
这个虚拟的解决方法 (<%=""%>) 真是太好了,谢谢! - blackorchid

32

在阅读上面评论中提供的链接后,原来是与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

你应该将关于在答案顶部使用 "<%="" %> 的部分放在显眼的位置。 - kevinpo

6

在代码中声明变量__o,像这样:

public object __o;

请务必将其放置在主页面中(如果您正在使用一个)。

2
我不明白为什么有人要对这个答案点负一。它比添加<%="" %> 更加优雅。 - needfulthing
这个对我有用(Visual Studio 2019,.NET 4.8)。我无法让 <%="" %> 正常工作。 - Andy

5

2

这只是一个临时解决方案,它能够暂时解决问题,但不知何故错误消息又出现了。现在,即使我把它添加到页面的开头,它也不能再解决这个消息了。 - Jay Imerman

0
在我的旧ASP.net MVC项目中,我将以下代码放在主页面的顶部,它至少在一个实例中起到了帮助作用,而<%="" %>则没有帮助:
<script runat="server" type="text/C#">
public object __o;
</script>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接