尽管null测试

时间:2017-05-18 11:56:38

标签: c# argumentnullexception

我有行

 if(query.GetRecordsFromResults() != null)
 RecordsList.AddRange(query.GetRecordsFromResults());

GetRecordsFromResults()返回IList<IRecord>的位置。尽管有if条件,我得到System.ArgumentNullException。那是为什么?

错误的方法:

 foreach (var query in QueryList)
 {
    query.ExecutePreparedQuery();
    if(query.GetRecordsFromResults() != null)
    RecordsList.AddRange(query.GetRecordsFromResults());
 }

QueryListList<Query>queryQuery。两者都被实现,实例化和初始化(验证)。

 public override IList<IRecords> GetRecordsFromResults()
 {
   var recordsList = new List<IRecords>();

   if (Result != null && Result.Count != 0)
   {
      RecordBuilder.Value = Result.Count;
      RecordBuilder.Querytype = QueryDescription();
      RecordBuilder.Dateformatted = DateFormatting();
      RecordBuilder.WebTitle = Web.Title;

      recordsList.Add(RecordBuilder.BuildRecord());

      return recordsList;
 }

      RecordBuilder.Value = 0;
      RecordBuilder.Querytype = QueryDescription();
      RecordBuilder.Dateformatted = DateFormatting();
      RecordBuilder.WebTitle = Web.Title;

      recordsList.Add(RecordBuilder.BuildRecord());

      return recordsList;
}

ResultQuery的属性,在Query.ExecutePreparedQuery调用期间更新。如果查询失败,它可能为null。 RecordBuilderIRecord实现的构建器,它是一堆字符串和int属性。 QueryDescriptionQuery返回字符串的自描述方法。 DateFormating返回DateTime属性中的字符串。

环境不是多线程的,Query是一个抽象类,显示的GetRecordFromResults是抽象子类中的覆盖(下面是其他子类是真正的实现)。

1 个答案:

答案 0 :(得分:2)

除了你得到的例外,你做的方式是错误的,它会像下面这样;

// Make sure that you have initialized/instantiated RecordsList
var iListResult = query.GetRecordsFromResults();
if(iListResult != null)
{
   RecordsList.AddRange(iListResult);
}

显然这将解决您的问题。这是因为(可能是)GetRecordsFromResults()内发生的事情,这意味着第一次调用返回预期结果(这就是条件评估为真的原因),第二次调用返回null