用于呼叫时的循环错误

时间:2013-04-17 11:20:55

标签: c# .net for-loop

我有以下代码

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方法返回列表ok然后如果我将断点放在for循环上并将鼠标悬停在recordListz对象上它看起来很好(有10条记录)它)和计数也报告10条记录。但是,当我尝试执行循环时,代码错误声称“对象未设置为对象的实例”(列表中的对象的非空)。此外,如果我此时快速监视对象,它声称值为[''为空]。

现在讨论创建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方法中调用,该方法工作正常并且与调用它的代码在同一个类中...

将行移到代码的顶部会使错误停止,但这会导致循环错误。

到底发生了什么,我以前从未见过这个。

----------------------- UPDATE -------------------

好的,如果我有以下代码

-----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语句之前那么一切都很好。

1 个答案:

答案 0 :(得分: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>

灵线从来没有受到影响(因为循环失败后循环失败),所以这看起来不像问题。然而确实是问题。不知道为什么这一行也停止了远远高于它的代码(即实例化recordLista List),但确实在整个地方引起了问题。

实际问题是WrittenRecords整数列表作为空列表返回(不是null,但没有项目),虽然在进入循环之前,一旦try catch捕获到错误,WrittenRecords就会报告为空列表然后把它报告为Null,这仍然让我感到困惑.....然而,如果列表中没有项目我就不需要运行此代码,在for循环周围放置一个if语句,只允许它在WrittenRecords包含时运行项目似乎已经解决了这个问题。

然而,我仍然不知道为什么循环根本无法执行,为什么linq代码失败了什么只是一个空列表,为什么空列表突然变成了捕获的空列表或者为什么错误抛出由linq声明它是null或为什么linq代码阻止recordLista完全被实例化。但至少我的代码现在有效。