我在以下内容中收到错误System.ArgumentNullException: Value cannot be null.
:
foreach (var pmt in payment.NewInvoiceViewModels
.Where(x => x.PaymentReceived != 0) ??
Enumerable.Empty<NewInvoiceViewModel>())
我要做的就是检查payment.NewInvoiceViewModels在我迭代它之前为空(如果它为null,则会导致错误)。
有没有更好的方法来实现这一目标?
答案 0 :(得分:9)
你有一个空合并运算符在错误的位置 - 目前你无条件地在Where
上调用payment.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))
答案 1 :(得分:3)
你想要这样的东西
if(payment.NewInvoiceViewModels!=null)
{
foreach (var pmt in payment.NewInvoiceViewModels
.Where(x => x.PaymentReceived != 0) ??
Enumerable.Empty<NewInvoiceViewModel>())
}