即使我检查我的IEnumerable为null我仍然得到一个null异常...为什么?

时间:2010-10-06 22:48:46

标签: asp.net-mvc linq-to-sql

下面代码中的第25行如何生成后面的错误?我很困惑。 ProductSuggestions为IEnumerable<Product> ProductSuggestions

Line 24: <%if (Model.ProductSuggestions != null) { %>
Line 25:     <%if (Model.ProductSuggestions.Any()) { 

对象引用未设置为对象的实例。

描述:执行当前Web请求期间发生了未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.NullReferenceException:未将对象引用设置为对象的实例。

4 个答案:

答案 0 :(得分:2)

你是否肯定问题是第25行,而不是第24行?尝试制作第24行

<%if (Model != null && Model.ProductSuggestions != null) { %>

看看你是否得到了同样的错误。我的猜测是你不会。

答案 1 :(得分:0)

NullReferenceException可以引用ProductSuggestions对象的成员吗?

我刚刚遇到一个问题,我检查了一个父对象为null,但是当我尝试访问任何子属性时,我收到了NullReferenceException。

答案 2 :(得分:0)

我道歉,但根据我提供的信息,这个问题并不容易解决。

在睡觉之后,我突然意识到即使我在列表中输入IEnumerable它仍然是IQueryable,因为它是我的存储库中的LINQ查询的结果。延迟执行IQueryable后,在我在视图中的设置上调用.Count().Any()之前,问题并未显现。

这个问题确实位于Repository中,我的LINQ查询设置没有考虑可能的NULL。

所以,答案应该是:你这个白痴,你确定你正在处理IEnumerable而不是IQueryable吗?如果这真的是IQueryable,你确定问题不在LINQ查询本身,而不是在它被执行的地方吗? :)

答案 3 :(得分:0)

评估查询(IEnumerable或IQueryable)是潜在的异常来源,即使查询本身不为空。

Customer c = null;

List<Customer> customers = new List<Customer>() {c};

IEnumerable<Customer> query = customers.Where(x => x.Name == "Bob");

if (query != null)
{
  Console.WriteLine("query is not null");
}
try
{
  bool result = query.Any();
}
catch
{
  Console.WriteLine("null exception when query was evaluated");
}