0

次のコードがあります

List<WorkingRecord> recordListz = new List<WorkingRecord>();

-----other unrelated code----------

recordListz = IF_Export(out ifRecCount,out WrittenRecords);

for (int i = 0; i < recordListz.Count; i++)
{
//do something
}

recordListz は正常に作成されます (まあ、後で詳しく説明します)。IF_Export メソッドは正常にリストを返します。次に、for ループにブレークポイントを配置し、recordListz オブジェクトにカーソルを合わせると、正常に見えます (10 個のレコードが含まれています)。カウントも 10 レコードを報告します。ただし、ループを実行しようとするとすぐに、「オブジェクトがオブジェクトのインスタンスに設定されていません」というコードエラーが発生します(リスト内のオブジェクトはnullではありません)。さらに、この時点でオブジェクトを簡単に監視すると、値が ['' is null] であると主張します。

まず、recordListz オブジェクトの作成に関する問題について説明します。実際には、recordListz のインスタンス化とメソッド呼び出しの間に、別のコード (上記のコードとはまったく関係ありません) があります。もともと私は次のコードを持っていました

List<WorkingRecord> recordListz = IF_Export(out ifRecCount,out WrittenRecords);

ただし、これにより、呼び出されたメソッドが完全に細かいリストを返したにもかかわらず、「オブジェクトがオブジェクトのインスタンスに設定されていません」というエラーが発生しました (メソッドの戻り行にブレークポイントを配置することで確認されました)。

私はそれを次のように分割しました

List<WorkingRecord> recordListz = new List<WorkingRecord>();
recordListz = IF_Export(out ifRecCount,out WrittenRecords);

ただし、これは最初の行で「オブジェクトがオブジェクトのインスタンスに設定されていません」というエラーが発生しました。私は、正常に動作し、それを呼び出すコードと同じクラスにある IF_Export メソッドで呼び出されるのとまったく同じ行を持っています...

行をコードの先頭に移動すると、エラーが発生しなくなりましたが、ループ エラーが発生しました。

一体何が起こっているのか、私はこれまで見たことがない。

- - - - - - - - - - - -アップデート - - - - - - - - - -

次のコードがあればOK

-----other unrelated code----------
List<int> WrittenRecords=new List<int>();
List<WorkingRecord> recordListz = new List<WorkingRecord>();

recordListz = IF_Export(out ifRecCount,out WrittenRecords);

for (int i = 0; i < recordListz.Count; i++)
{
//do something
}

recordListz インスタンス化行で、「オブジェクトがオブジェクトのインスタンスに設定されていません」というエラーが表示される

ただし、次のコードがある場合

-----other unrelated code----------
List<WorkingRecord> recordLista = new List<WorkingRecord>();
List<int> WrittenRecords=new List<int>();
List<WorkingRecord> recordListz = new List<WorkingRecord>();

recordListz = IF_Export(out ifRecCount,out WrittenRecords);

for (int i = 0; i < recordListz.Count; i++)
{
//do something
}

その後、recordListz のインスタンス化は引き続きエラーになりますが、recordLista のインスタンス化は正常に機能します。

さらに、次のコードがある場合

-----other unrelated code----------
List<int> WrittenRecords=new List<int>();
List<WorkingRecord> recordLista = new List<WorkingRecord>();
List<WorkingRecord> recordListz = new List<WorkingRecord>();

recordListz = IF_Export(out ifRecCount,out WrittenRecords);

for (int i = 0; i < recordListz.Count; i++)
{
//do something
}

recordLista も正常に動作します。

--------別のアップデート------

次のコードを入れると

-----other unrelated code----------
List<int> WrittenRecords=new List<int>();
List<WorkingRecord> recordLista = new List<WorkingRecord>();
List<WorkingRecord> recordListz = new List<WorkingRecord>();

recordLista = IF_Export(out ifRecCount,out WrittenRecords);

for (int i = 0; i < recordLista.Count; i++)
{
//do something
}

エラーが発生したのは recordLista のインスタンス化です........

--------更新 3 ---------------

わかりました、奇妙なことが起こっている時点を見つけました。

コードはif文の中にあります

if (dsExportRecords != null && dsExportRecords.Tables[0].Rows.Count != 0)

dsExportRecords はデータセットです。コードを if ステートメント内にすぐに配置すると、奇妙なことが起こりますが、if ステートメントの直前であれば、すべて問題ありません。

4

1 に答える 1

0

私は問題を発見しました(まあ、私のコードはとにかく動作します)

問題は、一部の Linq コードであることが判明しました。

失敗していたループは以下の通り

for (int i = 0; i < recordLista.Count; i++)
{
    int id = (from r in WrittenRecords where r == recordLista[i].RequestID select r).FirstOrDefault();
    if (id != 0)
    {
        //do something
    }
}

WrittenRecords はList<int>

ling ラインがヒットすることはありませんでした (ループに入るとすぐにループが失敗したため)。しかし、それは確かに問題でした。この行がその上にあるコードの動作を停止した理由 (つまり、recordLista List のインスタンス化) も不明ですが、実際にはあらゆる場所で問題が発生しました。

実際の問題は、WrittenRecords 整数リストが空のリスト (null ではなく、アイテムがない) として返され、ループに入る前に WrittenRecords が空のリストであると報告したにもかかわらず、try catch がエラーをキャッチしてからそれを報告したことでした。まだ私を困惑させているNullとして.....ただし、リストにアイテムがない場合はこのコードを実行する必要がないため、forループの周りにifステートメントを配置して、WrittenRecordsにアイテムが含まれている場合にのみ実行できるようにします問題を解決しました。

ただし、ループがまったく実行されなかった理由、linq コードが単に空のリストで失敗した理由、空のリストが catch で突然 null リストに変わった理由、または実際に linq によってスローされたエラーが述べられている理由はまだわかりませんそれがnullだったこと、またはlinqコードがrecordListaのインスタンス化をまったく停止した理由。しかし、少なくとも私のコードは機能するようになりました。

于 2013-04-18T10:04:12.780 に答える