Подтвердить что ты не робот

Имя "__o" не существует в текущем контексте

Я только что установил Visual Studio 2015 и открыл мой проект asp.net, над которым я работал. Я получаю много ошибок (все точно такие же), как показано ниже:

Ошибка CS0103 Имя "__o" не существует в текущем контексте

Ну, на самом деле у меня нет переменных с именем __o, и код работает как шарм (ошибка неверна), но меня беспокоит то, что я не могу видеть, когда у моего кода действительно есть ошибка, так как она идет где-то в этом списке, и я должен проверить весь список.

введите описание изображения здесь

4b9b3361

Ответ 1

Я обнаружил, что если я выберу Build Only вместо Build + IntelliSense, ошибки (связанные с IntelliSense) исчезнут.

enter image description here

Обновление 1: причина

Причина, по которой это происходит, заключается в том, что для таких кодов:

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

Чтобы предоставить IntelliSense в блоках & lt;% =%> во время разработки, ASP.NET генерирует присваивание временной переменной __o, а язык (VB или С#) затем предоставляет IntelliSense для переменной. Это делается, когда компилятор страницы видит первый блок & lt;% =...%>. Но здесь блок находится внутри if, поэтому после закрытия if переменная выходит из области видимости. В итоге мы генерируем что-то вроде этого:

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

Обходной путь - добавить фиктивное выражение в начале страницы. Э.Г.

<%=""%>

Это ничего не будет отображать, и оно будет гарантировать, что __o объявлен как верхний уровень в методе Render, перед любым потенциальным оператором if (или другим ограничением).

Обновление 2: избавление от этой ошибки без потери других ошибок IntelliSense

Нажмите кнопку фильтра в верхнем левом углу панели списка ошибок и снимите флажок с CS0103, код ошибки для которого: Имя __o не существует в текущем контексте и эти ошибки больше не будут отображаться, и у вас все еще могут быть другие ошибки и предупреждения IntelliSense:

enter image description here

Ответ 2

После прочтения ссылок, приведенных в комментариях выше, выясняется, как intellisense обрабатывает блоки if.

Михаил Архипов опубликовал объяснение и обходной путь в ASP.NET форумы:

Мы, наконец, получили надежное воспроизведение и определили основную проблему. Тривиальное воспроизведение выглядит следующим образом:

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

Чтобы обеспечить intellisense в блоках <%= %> во время разработки, ASP.NET генерирует присваивание временной переменной __o и языку (VB или С#), затем введите intellisense для переменной. Это сделано, когда компилятор страницы видит первый блок <%= ... %>. Но здесь блок находится внутри if, поэтому после закрытия if переменная гаснет области видимости В итоге мы генерируем что-то вроде этого:

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

Обходной путь - добавить фиктивное выражение в начале страницы. Например. <%="" %>. Это ничего не сделает, и это обязательно что __o объявлен верхним уровнем в методе Render, до того, как потенциальное if (или другое обзорное) утверждение.

Отмечая выше, ответ Ошибка на самом деле не приносит большого вреда, кроме сокрытия всех ошибок intellisense, которые в любом случае будут известны во время сборки.

Ссылка:http://youku.io/questions/324366/asp-net-mvc-error-name-o-is-not-declared https://msdn.microsoft.com/en-us/library/t8zbaa6f.aspx

Ответ 3

<% response.write(var)% > вместо <% = var% > удаляет ошибку без объявления __o, как предполагалось, других сообщений

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

Ответ 4

Что решило эту проблему от всего сердца, так это добавление фиктивного выражения в начале страницы. Например. & lt;% = ""%>. Проверьте эту ссылку для дальнейшего объяснения: https://forums.asp.net/post/1263727.aspx

Ответ 5

Объявить переменную __o в коде, например:

public object __o;

Обязательно поместите его в главную страницу (если вы используете ее).