2011-03-30 44 views
2

我有一個奇怪的問題。當我在使用數組時,IIf正在搞亂。顯然它是檢查我的其他語句,即使它沒有被激活。下面是一些演示問題代碼:vb.net - IIf拋出奇怪的異常

'works 
Dim test As String = "bleh" 
If values.Length < 6 Then 
    test = "200" 
Else 
    test = values(5) 
End If 

'throws indexoutofrange exception 
Dim itemLimit As String = IIf(values.Length < 6, "200", values(5)) 
+0

您正在使用什麼版本的VisualStudio? – Pondidum 2011-03-30 23:15:12

+0

我正在使用Microsoft Visual Basic 2010 Express。 – Phil 2011-03-30 23:16:25

+0

[使用VB.NET IIF的可能的重複我得到NullReferenceException](http://stackoverflow.com/questions/428959/using-vb-net-iif-i-get-nullreferenceexception) – MarkJ 2012-02-21 08:50:09

回答

8

Iif運營商不實現短路,並將評估真假的情況。如果你想要一個短路版本,然後使用If

Dim itemLimit As String = If(values.Length < 6, "200", values(5)) 
+0

謝謝!您提供了問題和解決方案。我唯一的問題是,如果它評估真假案例,IIF的意義何在? – Phil 2011-03-30 23:29:44

+0

@Phil'IIf'已經存在,至少VB 7(VB.Net的原始版本)。那時VB並沒有爲他們的大部分構造實現短路('和'/'或'實際上不會短路)。這個功能是當時設計的,因此沒有添加短路邏輯 – JaredPar 2011-03-30 23:31:19

1

看一看這篇文章:http://www.fmsinc.com/free/newtips/net/nettip33.asp

從文章:

的Visual Basic,VBA和Visual Basic .NET 支持IIF功能作爲 替代If ... Then ... Else 聲明。雖然這可能看起來像是 的一種快捷方式,但IIF的功能不同於 ,比If ... Then ... Else。

在準備參數時,IIF必須評估整個陳述 ,其中 會導致不良副作用。

換句話說,您的If...Then...Else可以工作,因爲如果條件失敗,Else子句不會被評估。另一方面,IIf評估所有語句,導致IndexOutOfBounds例外。