十进制? - Nullable对象必须具有值

Mat*_*son 0 vb.net asp.net-mvc nullable invalidoperationexception razor

我正在使用RazorVS2013中使用VB.NET MVC 5.1

siq.Price是一个十进制?

我正在尝试检查siq.Price是否有值,如果是,则将其打印为货币.我在尝试访问.Value属性时收到此错误,其中true为.HasValue返回true的元素:

可以为空的对象必须具有值.

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

异常详细信息:System.InvalidOperationException:Nullable对象必须具有值.

我尝试了这两行代码,认为它们应该没有问题,但收到了上面的错误:

@IIf(siq.Price.HasValue, siq.Price.Value, "N/A")
   'and
@IIf(siq.Price.HasValue, siq.Price.Value.ToString("C"), "N/A")
Run Code Online (Sandbox Code Playgroud)

一旦我从TruePart中删除了.Value,它就开始工作了:

@IIf(siq.Price.HasValue, siq.Price, "N/A")
    'and
@IIf(siq.Price.HasValue, String.Format("{0:C}", siq.Price), "N/A")
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释为什么会这样吗?!我很困惑.

注意:如果Price有值,这段代码就可以自己运行,但是在IIf()中没有:

@siq.Price.Value.ToString("C")
Run Code Online (Sandbox Code Playgroud)

Row*_*haw 5

IIF()VB.Net中的函数始终评估true和false部分.相反,您应该更改为使用IF()运算符,该运算符仅计算返回值,如下所示:

@If(siq.Price.HasValue, siq.Price.Value.ToString("C"), "N/A")
Run Code Online (Sandbox Code Playgroud)