C#/LINQ错误:名为';mbr&x27;已在此范围中定义

C#/LINQ错误:名为';mbr&x27;已在此范围中定义,c#,linq,switch-statement,case-statement,C#,Linq,Switch Statement,Case Statement,不必在每个案例上都加上大括号{}并将代码添加到每个案例中。有没有更简单的方法?目前,按照下面的方法,我遇到了一个错误,我试图避免使用大括号,并在每种情况下添加相同的代码。有什么想法吗?谢谢 private int GetMemberInfoByID(string strMemberID, int intAVersion) { try { switch (intAVersion)

不必在每个案例上都加上大括号{}并将代码添加到每个案例中。有没有更简单的方法?目前,按照下面的方法,我遇到了一个错误,我试图避免使用大括号,并在每种情况下添加相同的代码。有什么想法吗?谢谢

private int GetMemberInfoByID(string strMemberID, int intAVersion)
        {
            try
            {

                switch (intAVersion)
                {
                    case (int)A_Version.A6:
                        dbA6ReplDataContext mbr = new dbA6ReplDataContext();
                        break;
                    case (int)A_Version.A7:
                        dbA7ReplDataContext mbr = new dbA7ReplDataContext();
                        break;
                }

                var member = (
                       from m in mbr.MEMBERs
                       join ma in mbr.ADDRESSes on "S " + m.CONTRACT_NBR equals ma.ADDR_WHO
                       where m.MEMBER_NBR == strMemberID
                          && (ma.VOID[0] != 'V'
                       select ma.YMDEND).ToList();

                if (member == null || member.Count == 0)
                    return Int32.Parse(DateTime.Now.ToString("yyyyMMdd"));
                else
                    return member.Max();
            }
            catch (Exception ex)
            {
                cError err = new cError();
                err.ErrorMessage(ex);
                err = null;

                return Int32.Parse(DateTime.Now.ToString("yyyyMMdd"));
            }
        }

您可以使用
dynamic
键入以避免以丢失编译时检查为代价复制代码:

dynamic mbr = null;
switch (intAVersion)
{
    case (int)A_Version.A6:
        mbr = new dbA6ReplDataContext();
        break;
    case (int)A_Version.A7:
        mbr = new dbA7ReplDataContext();
        break;
}

如果
intAVersion
无效,您可以添加任何需要的验证,例如
null
检查。

您可以使用
动态
键入以避免以丢失编译时检查为代价重复代码:

dynamic mbr = null;
switch (intAVersion)
{
    case (int)A_Version.A6:
        mbr = new dbA6ReplDataContext();
        break;
    case (int)A_Version.A7:
        mbr = new dbA7ReplDataContext();
        break;
}

取决于您添加任何您想要的验证,例如
null
intAVersion
无效的情况下进行检查。

看起来
dbA6ReplDataContext
&
dbA7ReplDataContext
类非常相似。如果是这种情况,最好的方法是为这两个变量创建一个公共接口&将变量声明为该类型

IReplDataContext mbr = null;
switch (intAVersion)
{
    case (int)A_Version.A6:
        mbr = new dbA6ReplDataContext();
        break;
    case (int)A_Version.A7:
        mbr = new dbA7ReplDataContext();
        break;
}

使用公共接口(
IReplDataContext
,在本例中)将允许您继续使用两种类型之间的相似性,同时仍然提供类型安全性

似乎
dbA6ReplDataContext
dbA7ReplDataContext
类非常相似。如果是这种情况,最好的方法是为这两个变量创建一个公共接口&将变量声明为该类型

IReplDataContext mbr = null;
switch (intAVersion)
{
    case (int)A_Version.A6:
        mbr = new dbA6ReplDataContext();
        break;
    case (int)A_Version.A7:
        mbr = new dbA7ReplDataContext();
        break;
}

使用公共接口(
IReplDataContext
,在本例中)将允许您继续使用两种类型之间的相似性,同时仍然提供类型安全性

如果它们没有基类,则必须复制code@DarrenYoung我也这么想,直到我意识到每个街区的类型都不一样。是的,对不起。我的错!实际上,唯一的解决方案(如果您不想确定它的范围)是让dbA6ReplDataContext和dbA7ReplDataContext都派生自某个公共基类。然后,您可以在switchBase类或接口最干净之前声明基类类型的mbr变量<代码>动态可以工作,但您至少不会有intellisense或编译时验证。如果它们没有基类,则必须复制code@DarrenYoung我也这么想,直到我意识到每个街区的类型都不一样。是的,对不起。我的错!实际上,唯一的解决方案(如果您不想确定它的范围)是让dbA6ReplDataContext和dbA7ReplDataContext都派生自某个公共基类。然后,您可以在switchBase类或接口最干净之前声明基类类型的mbr变量<代码>动态可能会起作用,但您至少不会有intellisense或编译时验证。应该提到的是,问题中声明的“mbr”与使用它的位置在不同的范围内。这个解决方案也解决了这个问题。可能应该提到的是,问题中声明的“mbr”与使用它的范围不同。这个解决方案也解决了这个问题。