Имя "__o" не существует в текущем контексте
Я только что установил Visual Studio 2015 и открыл мой проект asp.net, над которым я работал. Я получаю много ошибок (все точно такие же), как показано ниже:
Ошибка CS0103 Имя "__o" не существует в текущем контексте
Ну, на самом деле у меня нет переменных с именем __o, и код работает как шарм (ошибка неверна), но меня беспокоит то, что я не могу видеть, когда у моего кода действительно есть ошибка, так как она идет где-то в этом списке, и я должен проверить весь список.
![введите описание изображения здесь]()
Ответы
Ответ 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;
Обязательно поместите его в главную страницу (если вы используете ее).