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

时间:2014-09-30 11:13:38

标签: asp.net-mvc vb.net razor nullable invalidoperationexception

我正在 VS2013 中使用 VB.NET MVC 5.1 Razor

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")

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

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

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

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

@siq.Price.Value.ToString("C")

3 个答案:

答案 0 :(得分:5)

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

@If(siq.Price.HasValue, siq.Price.Value.ToString("C"), "N/A")

答案 1 :(得分:1)

乍一看,VB.NET的IIf方法似乎与C#的三元运算符(?:)相当,但有一个很大的不同:因为它是一个很好的选择方法,而不是操作员,没有短路,并且两个参数在传递给方法之前总是被评估。

这意味着无论HasValue是否为真,都会评估siq.Price.Value"N/A",从而导致您看到的异常。

答案 2 :(得分:0)

IIf()运行true和false代码。 VB的条件If运算符是短路的,所以你现在可以安全地写下面的, 使用IIf功能是不可能的:

Dim len = If(text Is Nothing, 0, text.Length)