我正在 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")
答案 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)