web-dev-qa-db-ja.com

名前 '__o'は現在のコンテキストに存在しません

Visual Studio 2015をインストールし、作業中のasp .netプロジェクトを開きました。次のような多くのエラー(すべて同じ)が表示されます。

エラーCS0103名前 '__o'は現在のコンテキストに存在しません

実際、__ oという名前の変数はなく、コードはチャームのように機能します(エラーは無効です)が、気になるのは、このリストのどこかにコードが実際にエラーがある場合は表示できないことですリスト全体を確認する必要があります。

enter image description here

Build + IntelliSenseの代わりにBuild Onlyを選択すると、 (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;

回避策は、ページの早い段階でダミー式を追加することです。例えば。 <%= ""%>。これは何もレンダリングしません。また、潜在的なif(または他のスコープ)ステートメントの前に、__ oがRenderメソッドでトップレベルとして宣言されるようにします。

更新2:他のIntelliSenseエラーを失うことなくこのエラーを取り除く

エラーリストパネルの左上にあるフィルターボタンをクリックし、CS0103のチェックを外します。エラーコードは:名前「__o」は現在のコンテキストに存在せず、これらのエラーは表示されなくなり、他のIntelliSenseエラーと警告が引き続き発生する可能性があります:

enter image description here

上記のコメントに記載されているリンクを読んだ後、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;

回避策は、ページの早い段階でダミー式を追加することです。例えば。 <%="" %>。これは何もレンダリングしません。また、潜在的なif(または他のスコープ)ステートメントの前に、Renderメソッドで__oがトップレベルとして宣言されるようにします。

上記に注意してください。 Failure の答えは、ビルド時にとにかく知られているすべてのインテリセンスエラーを隠すことを除いて、実際にはそれほど害はありません。

参照: http://youku.io/questions/324366/asp-net-mvc-error-name-o-is-not-declaredhttps://msdn.Microsoft。 com/en-us/library/t8zbaa6f.aspx

28
Syakur Rahman

<%= var%>ではなく<%response.write(var)%>は、他の投稿として提案されているように__oを宣言せずにエラーを削除します

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

4
Omer K

この問題を心から解決したのは、ページの早い段階でダミーの表現を追加することでした。例えば。 <%= ""%>。詳細については、次のリンクを参照してください。 リンクの説明をここに入力

2
H. Grewal