2012-09-27 34 views
1

按钮的宽度是123,为什么不以下更改它的宽度使用IIF错误

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 
    With Me.Button3 
     IIf(.Width = 123, .Width = 233, .Width = 150) 
    End With 
End Sub 

IIF是否只返回一个值?即如果我想设置按钮的宽度属性,那么我是否需要使用If结构?

很少谈到IIF在MSDN

回答

1

IIF是否只返回一个值?

是的。

即即使我想设置按钮的宽度属性,那么我是否需要使用If结构?

不行,因为你可以返回值分配给Width属性:

With Me.Button3 
    .Width = IIf(.Width = 123, 233, 150) 
End With 

需要注意的是,在VB.NET的当前版本中,If Operator应该用来代替IIF,因为它有各种优点(类型安全,短路等)。例如,使用If(...)将允许您的代码在没有额外投射的情况下编译,即使您有Option Strict On(您应该)。

With Me.Button3 
    .Width = If(.Width = 123, 233, 150) 
End With 
+0

好吧 - 我假设VB的'Option Strict On'和VBA的'Option Explicit'等价的功能? – whytheq

+0

@whytheq:不,VB的Option Explicit等价于VBA的Option Explicit。 ['Option Strict'是新东西](http://msdn.microsoft.com/de-de/library/vstudio/zcd4xwzs.aspx)它禁止隐式转换。 – Heinzi

+0

很高兴我问 - 感谢您的额外信息+答案 – whytheq

2

你的代码测试.Width = 123,那么如果真或.Width = 150如果假返回布尔表达式.Width = 233,然后引发的结果了。这不是你想要的。你有三种选择:

' IIf function - not recommended since it is not typesafe and evaluates all arguments. 
.Width = IIf(.Width = 123, 233, 150) 

' If operator - typesafe and only evaluates arguments as necessary. 
.Width = If(.Width = 123, 233, 150) 

' If statement - not an expression. 
If .Width = 123 Then .Width = 233 Else .Width = 150 
+0

正常 - 但没有'==在VB'相比,C#这样做的comiler如何决定'.WIDTH = 233'是一个布尔表达式,而不是我试图设置属性? – whytheq

+0

这取决于上下文。 ' = '被解释为赋值运算符,但是'='*里面*表达式被解释为相等运算符。 –

+0

+1谢谢。所以'IIf'是一个'expression',而'If'不是一个'expression',而是一个'operator'? – whytheq

2

使用VB.NEt的If() - 语句。它被称为“条件运算符”,并以多种语言存在。 IIf是一个VB特定的函数,具有不同的行为。 点击此处了解详情: Performance difference between IIf() and If

在这两种情况下,IIF和如果只返回一个值(IIF那些不输入,这是一个必须铸造的对象)。这似乎是你想反正事情:

Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click 
    Button3.Width = If(Button3.Width = 123, 233, 150) 
End Sub