2014-09-24 49 views
10

爲什麼在VB中要求不處理條件的直接轉換時纔有條件。例如,在C#這是蠻好的......如果C#和VB中存在差異,則條件爲

 bool i = false; 

     i = (1<2)? true:false; 

     int x = i? 5:6; 

但是,如果我在VB想同樣的事情,我會投它

Dim i as Boolean = CBool(IIF(1<2, True, False)) 
Dim x as Integer = CInt(IIF(i, 5, 6)) 

我不明白爲什麼C#會做轉換以及爲什麼VB沒有。 應該我在我的C#來鑄造條件語句,例如

bool i = Convert.ToBoolean((1<2)? True: False); 
int x = Convert.ToInt32(i? 5:6); 

而且,是的,我知道,IIF返回類型的對象,但我會假設,C#確實還有可以返回不僅僅是真多|假;在我看來,C#處理隱式轉換。

+12

'IIF'是一個傳統的VB函數;嘗試使用更新的'If'運算符,它的工作原理與你期望的一樣:'Dim i As Boolean = If(1 <2,True,False)' – Plutonix 2014-09-24 15:54:41

+2

'<'運算符(以及所有其他比較運算符)已經返回是真是假,請不要這樣做:'(1 <2)? true:false;' – 2014-09-24 15:55:53

+0

謝謝大家的信息:)是的@BrianDriscoll我通常不會這樣做我試圖展示我的意思的快速邏輯 - 謝謝你,雖然爲確保。 – alykins 2014-09-24 16:28:16

回答

26

IIf是一個函數和不等於的?: C#,這是操作員。

運營商版本已經存在於VB.NET一段時間,不過,就被稱爲If

Dim i As Boolean = If(1 < 2, True, False) 

...這是當然的,毫無意義的,而且應該只是被寫爲:

Dim i As Boolean = 1 < 2 

...或者,用Option Infer

Dim i = 1 < 2 
+0

感謝您的信息;很有幫助。新的開發我幾乎總是使用C#,但我也做了很多遺留轉換/升級(幾乎總是在VB中);不知道VB中只有IF(x,x,x) – alykins 2014-09-24 16:29:56

+2

@alykins:它不存在於VB中,只存在於VB.NET中,並且只存在於2008年之後。 – 2014-09-24 22:43:24

6

此代碼將向您顯示IIf功能和If運營商之間的區別。因爲IIf是一個函數,所以它必須評估所有傳遞給函數的參數。

Sub Main 
    dim i as integer 
    i = If(True, GetValue(), ThrowException()) 'Sets i = 1. The false part is not evaluated because the condition is True 
    i = IIf(True, GetValue(), ThrowException()) 'Throws an exception. The true and false parts are both evaluated before the condition is checked 
End Sub 

Function GetValue As Integer 
    Return 1 
End Function 

Function ThrowException As Integer 
    Throw New Exception 
    Return 0 
End Function