并且在IIF中也不会短路

Pio*_*ski 2 vb.net

任何人都可以精心制作的,为什么第二个抛出InvalidOperationException异常"可空对象必须有一个值",如果foo是什么都没有?我希望它与第一个片段一样工作,但显然我遗漏了一些东西:

小片1:

If foo IsNot Nothing AndAlso foo.HasValue Then
                            _foo = foo.Value.Days
                        Else
                            _foo = 365
                        End If
Run Code Online (Sandbox Code Playgroud)

如果foo为Nothing,则不抛出(如预期的那样)

摘录2:

_foo = CInt(IIf(foo IsNot Nothing AndAlso foo.HasValue, foo.Value.Days, 365))
Run Code Online (Sandbox Code Playgroud)

如果foo为Nothing,则抛出InvalidOperationException - 为什么?

Tim*_*ter 8

因为旧IIf函数不是新If运算符.旧的不会短路,而新的则会短路.

_foo = If(foo IsNot Nothing AndAlso foo.HasValue, foo.Value.Days, 365)
Run Code Online (Sandbox Code Playgroud)

你也不需要施放而If不是IIf.

您可以使用新的null-conditional-operator 使其更简洁?:

_foo = If(foo?.Days, 365)
Run Code Online (Sandbox Code Playgroud)

使用2个参数,If-operator是一个零合并,其中3个用作条件运算符.