21

我有以下内容,但它失败了NullReferenceException

<td>@item.FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault().OneMonth ?? -</td>

OneMonth定义为

public virtual decimal? OneMonth { get; set; }

并且在失败时它的值为空。

我认为 Null Coalesce 运算符会测试它是否为 null,如果是,则将值返回到运算符的右侧?

我需要改变什么才能使这项工作?

4

2 回答 2

33

如您所写,剃刀语法以“OneMonth”结尾。这 ??被解释为文本。要将其解释为剃刀,您必须将整个语句包装在 () 中,如下所示:

<td>@(item.FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault().OneMonth ?? "-")</td>

这仍然会给你一个错误:左边的运算符是一个小数,右边的运算符是一个字符串。因此,您可以呈现零而不是“-”或使用三元运算符,将 OneMonth.Value.ToString() 作为左值,将“-”作为右值。

于 2011-12-09T11:16:03.513 回答
1

这与 MVC 或 Razor 无关。

FundPerformance.Where(xx => fund.Id == xx.Id).FirstOrDefault()

如果没有匹配的元素,将返回 null,null 没有 OneMonth 属性,因此您将获得 null ref 异常。你不能使用 ?? 运算符,因为它不是 OneMonth 为空,它是FirstOrDefault().

测试将您的代码更改为

FundPerformance.Where(xx => fund.Id == xx.Id).First().OneMonth ?? -</td>

如果您收到“序列不包含任何元素”异常,那么您就知道这是您的问题。

于 2011-12-09T10:50:24.790 回答