2012-07-18 33 views
2

我試圖使用IIF在vb.net,這裏是我的代碼如何避免在IIF中碰到虛假的部分?

Dim arr as new MyClass("ABC") 
MyAnotherMethod(IIf(arr.SelectedValue.Count < 1, Nothing, arr.SelectedValue(0).Value),"xxx","yyy","zzz") 

上述IIF會碰上真正的一部分,但在我運行此代碼,我得到了以下信息:

索引超出了數組的範圍。

我認爲原因是雖然真正的部分應該運行,但arr.SelectedValue(0).Value已經傳入IIF,因此虛假部分仍然被引用。

有沒有像「andalso」這樣的邏輯,適合我的情況?爲了避免運行錯誤的部分。

非常感謝!

+0

[vb.net - IIf拋出奇怪異常]的可能重複(http://stackoverflow.com/questions/5493583/vb-net-iif-throwing-strange-exception) – MarkJ 2012-07-18 11:56:25

回答

6

您需要使用IF Operator代替IIF功能

「的。如果運營商被稱爲有三個參數就像是一個IIf函數不同之處在於它使用短路評價爲」

它也是類型安全的,而IIF則不是,所以你應該真正使用它。看看這些工作的例子:

Dim i As Integer 

    'compiles if option strict is off (this is bad) 
    i = IIf(True, "foo", 4) 

    'compiles even if option strict on, but results in a runtime error (this is even worse) 
    i = CInt(IIf(True, "foo", 4)) 

    'won't compile (this is good because the compiler spotted the mistake for you) 
    i = If(True, "foo", 4) 
+0

哇...我沒有理解代碼的最後一行爲什麼不編譯。 – 2012-07-18 10:42:18

+0

這是因爲返回的類型必須與賦值類型相同(在本例中爲Integer('i'))。在這個例子中,我給出了其中一種類型是字符串,因此編譯失敗。 – 2014-03-17 09:36:40

0

IIf已被棄用,正是在它的地方使用If

result = If(condition, truePart, falsePart) 

爲了完整性,也有使用它的第二個辦法:

result = If(mayBeNothing, Alternative) 

這兩個運算符對應於C#的條件運算符… ? … : …及其空合併運算符… ?? …

但@dasblinkenlight是正確的:在你的情況下,使用FirstOrDefault而不是條件更合適。

+0

感謝C#技巧! – 2012-07-18 10:34:21