C# 在foreach中设置var以供以后使用

C# 在foreach中设置var以供以后使用,c#,razor,C#,Razor,我试图在foreach中设置一个值,但得到的错误是,它不存在于当前上下文中 这是我的密码 @{ string sUsr = System.Web.HttpContext.Current.Request.ServerVariables["AUTH_USER"].ToLower(); var db = Database.Open("SQLServerConnectionString"); var selectUser = "SELECT * F

我试图在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

在此上下文中,
sReg
仅应用于
foreach
循环中

您获取当前上下文中不存在的错误的原因是它不在范围内

如果您想继续并使用
var sReg
执行某些操作,则必须在循环内执行您想执行的任何操作,或者在需要时在循环外声明它


希望这有助于更改代码,以便在foreach循环的范围之外定义sReg。您可以这样做:

var sReg;
@foreach (var userid in db.Query(selectUser)) 
{
    sReg = userid.userdisplayname;
    var sAns = userid.usersign;
    var smail = userid.usermail;
}
现在可以在循环体外部使用sReg的(最后一个)值

代码中定义的变量只有有限的可用区域,通常称为变量的“范围”。
阅读以了解有关C#中作用域的更多信息


请注意,您可能会从查询中获得多个结果(除非您使用top 1或类似选项进行选择)。在这种情况下,您的sReg变量将只包含上一次迭代的值,这可能不适合您。在这种情况下,可能会出现一个列表:

@sReg
确实超出了
foreach
的范围。您需要在使用
foreach
的foreach中使用它,这意味着您需要多个结果。因此,每个结果(可能)为
sReg
指定了不同的值。稍后,在循环之外,您尝试访问
sReg
——但是哪个值?这里有一些不清楚的想法。解释得很好!谢谢将var放置在foreach外部时,它就像一个符咒。
var sReg;
@foreach (var userid in db.Query(selectUser)) 
{
    sReg = userid.userdisplayname;
    var sAns = userid.usersign;
    var smail = userid.usermail;
}