LINQ引发System.NullReferenceException

时间:2015-05-11 09:37:41

标签: c# .net linq nullreferenceexception

System.NullReferenceException的相关帖子没有帮助,请避免将其链接或标记为重复!

代码目的:检查字符串docType列表中是否存在replaceEntitiesConfig.DocTypes(字符串变量)。

有效的代码:

private bool MustReplaceEntities(DocumentRequestModel docRequest, DocumentRequestOptions requestedInfo)
{
    var replaceEntitiesConfig = this.ConfigurationManager.GetModel<ReplaceEntitiesConfigModel>(ConfigurationModels.ContextualMenus, this.ApplicationContext.Application.ProductId);
    if (requestedInfo.Text && !replaceEntitiesConfig.DocTypes.IsEmpty())
    {
        var docType = this.GetDocument(docRequest, new DocumentRequestOptions { DocType = true }, DecoratorTypes.None).DocType;
        foreach (var configuredDocType in replaceEntitiesConfig.DocTypes)
        {
            if (configuredDocType.Equals(docType, StringComparison.InvariantCultureIgnoreCase))
            {
                return true;
            }
        }
    }
    return false;
}

不起作用的代码:

private bool MustReplaceEntities(DocumentRequestModel docRequest, DocumentRequestOptions requestedInfo)
{
    var replaceEntitiesConfig = this.ConfigurationManager.GetModel<ReplaceEntitiesConfigModel>(ConfigurationModels.ContextualMenus, this.ApplicationContext.Application.ProductId);
    if (requestedInfo.Text && !replaceEntitiesConfig.DocTypes.IsEmpty())
    {
        var docType = this.GetDocument(docRequest, new DocumentRequestOptions { DocType = true }, DecoratorTypes.None).DocType;
        return replaceEntitiesConfig.DocTypes.Any(x => x.Equals(docType, StringComparison.InvariantCultureIgnoreCase));
    }
    return false;
}

使用LINQ语句时,抛出异常,甚至在初始化docType之前抛出异常。没有它(使用foreach),它完美地运作。 两个代码应该以相同的方式工作(甚至ReSharper建议我更改LINQ表达式的foreach),但是使用LINQ它失败了。

如果它不起作用,它不会比这一行更进一步 var docType = this.GetDocument(docRequest, new DocumentRequestOptions { DocType = true }, DecoratorTypes.None).DocType; 虽然它之前有效(唯一的变化是在这一行之后,程序逻辑是用LINQ语句而不是foreach完成的)

值:

  • docType =“LE”(我从未抛出异常的方式看到它,或者在抛出它的情况下,调试GetDocument方法)。
  • replaceEntitiesConfig.DocTypes = new List<string>();

1 个答案:

答案 0 :(得分:1)

您可能正在构建发布配置,其中一些优化已生效。在您的情况下,发生的情况是编译器推断出string docType未被使用,因此它将其从代码中删除,然后编译器发现DocumentResponseModel responseForDocType也未被使用,这也从代码中删除。不存在的代码不会导致异常。

但是,一旦引入了实际使用responseForDocType的其中一行,我们也必须拥有创建该东西的行,然后我们就会有例外。

TL; DR - 在Debug配置中构建,并看到差异。