System.ArgumentNullException:值不能为null。参数名称:source

时间:2016-10-20 08:11:00

标签: c# asp.net-mvc argumentnullexception

这里我的代码显示你传递的参数为null: -

[HttpPost]
public String Indexhome( IEnumerable<Seat>  Seats )
{
     if (Seats.Count(x => x.IsSelected) == 0)
     {
            return "you didnt select any seats";
     }
     else
     {
           StringBuilder sb = new StringBuilder();
           sb.Append("you selected");
           foreach (Seat seat in Seats)
           {
               if (seat.IsSelected)
               {
                   sb.Append(seat.Name + " ,");
               }
            }
           sb.Remove(sb.ToString().LastIndexOf(","), 1);
           return sb.ToString();
     }   
}

2 个答案:

答案 0 :(得分:1)

如果在没有匹配数据/查询参数的情况下调用方法,则Seats将为null。您还需要检查,例如:

[HttpPost]
public String Indexhome( IEnumerable<Seat>  Seats )
{
     if ((Seats == null) || !Seats.Any(s => s.IsSelected))
     {
            return "you didnt select any seats";
     }
     else
     {
           return "you selected " + string.Join(", ", Seats.Where(s => s.IsSelected).Select(s => s.Name));
     }   
}

答案 1 :(得分:0)

出现例外是因为 - 正如Lucero已经提到的那样 - Seatsnull。与通常的方法相比,这里没有NullReferenceException,因为Count是一种扩展方法:

public static int Count(this IEnumerable<T> source)
{
    if (source == null) throw new ArgumentNullException("source");
}

正如您所看到的,如果ArgumentNullExceptionNullReferenceException,该方法会引发source而不是null

另外,请不要使用Count检查您的集合是否包含项目,而是使用Any,因为它不会枚举完整的集合,并在第一个匹配条件时返回找到。

编辑:如果您打算使用另一种方法,这是一种正常的实例方法,您可以获得NRE:

Seats.DoSomething(); // throws NRE when Seats = null

因此在使用之前检查参数是否为null

[HttpPost]
public String Indexhome( IEnumerable<Seat>  Seats )
{
    if (Seats == null || !Seats.Any(x=> x.IsSelected))
        return "you didnt select any seats";
}