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;
    }
4

3 に答える 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」のフロー中に、いつどこで初期化されるかを確認してください。視覚的に明らかでない場合は、これを達成するためにプログラムに「ステップイン」する必要があるかもしれません。

于 2012-12-06T12:21:48.387 に答える
0

たぶん、あなたは常に新しい空の配列を返していagrDB.LoginAuthentication()て、IDEforeach loopはがアイテムを反復処理しないことを知っています。

于 2012-10-25T11:57:21.943 に答える
0

コードは到達可能ですが、実行されない場合、これempは空であることを意味します。の値が存在し、それが値usernameを返しているかどうかを確認する必要があります。passwordagrDb.LoginAuthentication(username, password)

于 2012-10-25T12:09:12.287 に答える