c# - El nombre ''__o'' no existe en el contexto actual
asp.net visual-studio (5)
Acabo de instalar Visual Studio 2015 y abrí mi proyecto asp .net en el que estaba trabajando. Recibo muchos errores (todos exactamente iguales) como a continuación:
Error CS0103 El nombre ''__o'' no existe en el contexto actual
Bueno, en realidad no tengo ninguna variable llamada __o y el código funciona como un amuleto (el error no es válido) pero lo que me molesta es que no puedo ver cuando mi código realmente tiene un error ya que va a algún lado en esta lista y debería consultar toda la lista.
<% response.write (var)%> en lugar de <% = var%> elimina el error sin declarar __o como se sugirió en otras publicaciones
Declara la variable __o en el código, así:
public object __o;
Asegúrese de ponerlo en la página maestra ( si está usando uno ).
Descubrí que si elijo Build Only en lugar de Build + IntelliSense, los errores (que están relacionados con intellisense) desaparecerán.
Actualización 1: La razón
La razón por la que esto está sucediendo es que para códigos como este:
<% if (true) { %>
<%=1%>
<% } %>
<%=2%>
Para proporcionar intellisense en bloques <% =%> en tiempo de diseño, ASP.NET genera una asignación a una variable __o temporal y el lenguaje (VB o C #) luego proporciona el intellisense para la variable. Eso se hace cuando el compilador de páginas ve el primer bloque <% = ...%>. Pero aquí, el bloque está dentro del if, así que después de que el if se cierre, la variable queda fuera del alcance. Terminamos generando algo como esto:
if (true) {
object @__o;
@__o = 1;
}
@__o = 2;
La solución consiste en agregar una expresión ficticia al principio de la página. Por ejemplo, <% = ""%>. Esto no generará nada, y se asegurará de que __o se declare como nivel superior en el método Renderizado, antes de cualquier declaración potencial (u otro alcance).
Actualización 2: Deshacerse de este error sin perder otros errores de intelliSense
Haga clic en el botón de filtro en la esquina superior izquierda del panel de listas de errores y desmarque CS0103, cuyo código de error para el: El nombre ''__o'' no existe en el contexto actual y estos errores ya no se mostrarán y usted todavía puede tener otros errores y advertencias de intelliSense:
Después de leer los enlaces que figuran en los comentarios anteriores, resulta ser lo que maneja intellisense si bloquea.
Mikhail Arkhipov publicó una explicación y solución en los foros de ASP.NET :
Finalmente hemos obtenido repro confiable e identificado el problema subyacente. Una reproducción trivial se ve así:
<% if (true) { %> <%=1%> <% } %> <%=2%>
Para proporcionar intellisense en bloques
<%= %>
en tiempo de diseño, ASP.NET genera una asignación a una variable__o
temporal y el lenguaje (VB o C #) luego proporciona el intellisense para la variable. Eso se hace cuando el compilador de páginas ve el primer bloque<%= ... %>
. Pero aquí, el bloque está dentro delif
, así que después de que elif
cierre, la variable queda fuera del alcance. Terminamos generando algo como esto:
if (true) { object @__o; @__o = 1; } @__o = 2;
La solución consiste en agregar una expresión ficticia al principio de la página. Por ejemplo,
<%="" %>
. Esto no generará nada, y se asegurará de que__o
se declare como nivel superior en el método Renderizado, antes de cualquier declaración potencial (u otro alcance).
Observando lo anterior, la respuesta de ASP.NET realidad no causa mucho daño, aparte de ocultar todo el error intellisense, que se conocería de todos modos en tiempo de compilación.
Referencia: there https://msdn.microsoft.com/en-us/library/t8zbaa6f.aspx
Lo que resolvió este problema desde su corazón para mí fue agregar una expresión ficticia al comienzo de la página. Por ejemplo, <% = ""%>. Consulte este enlace para obtener una explicación más detallada: ingrese la descripción del enlace aquí