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完成的)
值:
new List<string>();
答案 0 :(得分:1)
您可能正在构建发布配置,其中一些优化已生效。在您的情况下,发生的情况是编译器推断出string docType
未被使用,因此它将其从代码中删除,然后编译器发现DocumentResponseModel responseForDocType
也未被使用,这也从代码中删除。不存在的代码不会导致异常。
但是,一旦引入了实际使用responseForDocType
的其中一行,我们也必须拥有创建该东西的行,然后我们就会有例外。
TL; DR - 在Debug配置中构建,并看到差异。