为什么我的foreach代码无法访问?(已通过单元测试的工作代码副本)

4
下面的代码是完美运行的代码的精确副本。不同之处在于,这段代码被放置在一个WCF服务应用项目中,而工作的代码来自Windows窗体应用程序项目。foreach中的代码是无法到达的,这很奇怪,因为我以前测试过这段代码,并且它可以返回正确的值。
public IEnumerable<Employee> GetStudentDetails(string username,string password)
    {
        var emp = agrDb.LoginAuthentication(username, password);//procedure in the database thats returning two values
                                                                //Namely: EmployeeFirstName and EmployeeLastName
        List<Employee> trainerList = new List<Employee>();

        foreach (var item in emp)
        {
            //unreachable code here
            Employee employ = new Employee();
            employ.EmployeeFirstName = item.EmployeeFirstName;
            employ.EmployeeLastName = item.EmployeeLastName;
            trainerList.Add(employ);
            //trainerList.Add(item.EmployeeLastName);
        }
        return trainerList;
    }

6
这是编译器在抱怨代码无法到达吗?还是它只是没有进入循环?您能否创建一个简短但完整的程序来演示这个问题? - Jon Skeet
1
我唯一能看到的是 emp 必须是一个空集合。这并不意味着循环中的代码无法访问,只是程序流程不会进入循环。 - Roy Dictus
给我几分钟时间。我将创建一个小测试,以查看是否有实际的输出。 - Zubair
@Jon Skeet,编译器会替你找出这个问题吗?例如:for(int i=0; i<0; i++){Console.WriteLine("Impossible");},没有编译器错误或警告。 - Justin Harvey
编译器是告诉你代码无法到达,还是现在仍然在告诉你? - comecme
显示剩余2条评论
3个回答

6
foreach循环中的代码可能无法到达,如果数组或集合在运行时未初始化。
List<Employee> emp;

// Run when program starts, called from Program.cs
private void InitialiseApplication()
{
    emp = new List<Employee>;

    // Gather data for employees from... somewhere.
    DataAccess.GetEmployees(emp);
}

private void DoStuff()
{
    foreach (var item in emp)
    {
         // Do something.
    }
}

以上代码会出现警告,因为“emp”在设计时未初始化。

我在我的代码中也收到了同样的警告,包括在构造函数中。然而,运行时流程不受影响,因为此时“emp”已经被初始化。

你的代码可能也是这种情况。请检查程序流程中“emp”何时及在何处被初始化。如果这不是显而易见的,请尝试“步入”程序以实现此目的。


0
也许你总是在 agrDB.LoginAuthentication() 中返回一个新的空数组,而你的 IDE 知道 foreach 循环 永远不会遍历任何项。

0

代码是可达的,但如果没有执行,这意味着emp为空。您必须验证使用的usernamepassword的值是否存在,以及agrDb.LoginAuthentication(username, password)是否返回值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接