2011-03-30 43 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例外。