it-swarm.com.ru

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

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

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

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

enter image description here

49
Ashkan Mobayen Khiabani

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

enter image description here

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

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

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

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

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

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

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

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

enter image description here

96
Ashkan Mobayen Khiabani

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

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

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

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

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

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

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

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

Ссылка: http://youku.io/questions/324366/asp-net-mvc-error-name-o-is-not-declaredhttps://msdn.Microsoft. ком/EN-US/библиотека/t8zbaa6f.aspx

28
Syakur Rahman

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

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

4
Omer K

Что решило эту проблему от всего сердца, так это добавление фиктивного выражения в начале страницы. Например. <% = ""%>. Проверьте эту ссылку для дальнейшего объяснения: введите описание ссылки здесь

2
H. Grewal