2

我收到System.ArgumentNullException: Value cannot be null.以下错误:

 foreach (var pmt in payment.NewInvoiceViewModels
   .Where(x => x.PaymentReceived != 0) ?? 
    Enumerable.Empty<NewInvoiceViewModel>())

我要做的就是检查 payment.NewInvoiceViewModels 在我迭代它之前为空(如果它为空,则会导致错误)。

有没有更好的方法来实现这一目标?

4

2 回答 2

9

您将 null 合并运算符放在错误的位置 - 目前您正在无条件地调用Wherepayment.NewInvoiceModels然后检查结果是否为 null ......它永远不会是(Where根本不返回 null)。您可能想要:

foreach (var pmt in (payment.NewInvoiceViewModels ?? 
                     Enumerable.Empty<NewInvoiceViewModel>())
                   .Where(x => x.PaymentReceived != 0))

我个人会提取这个:

var allModels = payment.NewInvoiceViewModels ?? 
                     Enumerable.Empty<NewInvoiceViewModel>();

foreach (var pmt in allModels.Where(x => x.PaymentReceived != 0))

或者也许引入一个扩展方法:

public static IEnumerable<T> NullToEmpty(this IEnumerable<T> source)
{
    return source ?? Enumerable.Empty<T>();
}

然后:

foreach (var pmt in payment.NewInvoiceViewModels
                           .NullToEmpty()
                           .Where(x => x.PaymentReceived != 0))
于 2013-09-26T13:38:43.890 回答
3

你想要这样的东西吗

if(payment.NewInvoiceViewModels!=null)
{
  foreach (var pmt in payment.NewInvoiceViewModels
   .Where(x => x.PaymentReceived != 0) ?? 
    Enumerable.Empty<NewInvoiceViewModel>())
}
于 2013-09-26T13:33:51.227 回答