2015-06-02 25 views
3

我試圖在foreach中設置一個值,但是我得到它在當前版本中存在的錯誤。將var設置爲foreach以後使用

這是我的代碼;

@{ 
     string sUsr = System.Web.HttpContext.Current.Request.ServerVariables["AUTH_USER"].ToLower(); 
     var db = Database.Open("SQLServerConnectionString"); 
     var selectUser = "SELECT * FROM USERS WHERE username = " + @sUsr; 

     } 
    @foreach (var userid in db.Query(selectUser)) 
          { 
           var sReg = userid.userdisplayname; 
           var sAns = userid.usersign; 
           var smail = userid.usermail; 
          } 
...some html code etc. 

    @sReg <---- The name sReg dosent exist in the current context 

如果我與它的工作原理如下因素代碼嘗試的Hello World在這種情況下只有你foreach循環內應用呈現在我的網頁

@{ var myMessage = "Hello World"; } 

...some html code etc. 

    @myMessage 
+0

'@ sReg'確實超出了'foreach'的範圍。你需要在你的foreach中使用它*在你的foreach – CodingIntrigue

+4

你正在使用'foreach'這意味着你期待* multiple *結果。因此,這些結果中的每一個(可能)都將一個*不同的值賦給'sReg'。後來,在循環之外,你試圖訪問'sReg' - 但是哪個值?這裏有一些不清楚的想法。 –

回答

1

更改您的代碼,使SREG是foreach循環的範圍界定。您可以這樣做:

var sReg; 
@foreach (var userid in db.Query(selectUser)) 
{ 
    sReg = userid.userdisplayname; 
    var sAns = userid.usersign; 
    var smail = userid.usermail; 
} 

您現在可以在循環體外使用sReg(的最後一個)值。

代碼中定義的變量只有一個有限的可用區域,通常稱爲變量的「範圍」。
閱讀this article瞭解關於C#中的作用域的更多信息。

請注意,您可能會從您的查詢中獲得多個結果(除非您使用top 1或其他選項進行選擇)。在這種情況下,你的sReg變量將只包含最後一次迭代的值,這對你來說可能不是你想要的。在這種情況下,列表可能會出現救援:http://www.dotnetperls.com/list

+0

很好解釋!謝謝。當把變量放在foreach外時,它對lika很有用。 – Slint

1

sReg

你得到的原因在當前上下文中不存在的錯誤是因爲它不在範圍內。

如果您想繼續操作並使用您的var sReg執行某些操作,您必須在循環中執行任何您想要執行的操作,或者在需要時將其聲明在外。

希望這有助於