2014-09-24 14 views
10

Dlaczego warunkowe, jeśli w VB nie wymaga obsługi bezpośredniego rzutowania warunków. Na przykład w języku C# to jest dobrze ...Warunek, jeśli różnice w C# i VB

 bool i = false; 

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

     int x = i? 5:6; 

Ale gdybym chciał to samo w VB musiałbym rzucić to

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

Nie rozumiem dlaczego C# zrobi przekształcić i dlaczego VB tego nie robi. Gdyby będę odlewania na moich C# warunkowe np

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

Również Tak, jestem świadomy, że IIF zwraca obiekt typu ale zakładam, że C# robi, jak można zwrócić więcej niż tylko true | false; wydaje mi się, że C# obsługuje niejawną konwersję.

+12

'IIF' jest starszą funkcją VB; spróbuj z nowszym operatorem 'If' i działa tak, jak oczekujesz:' Dim i As Boolean = If (1 <2, True, False) ' – Plutonix

+2

Operator' <'(jak również wszystkie inne operatory porównania) już zwraca true lub false, więc proszę nie rób tego nigdy: '(1 <2)? true: false; ' –

+0

Dziękuję wszystkim za informacje :) Tak @BrianDriscoll Normalnie nie robiłbym tego, próbowałem pokazać szybką logikę tego, co miałem na myśli - dziękuję jednak za upewnienie się. – alykins

Odpowiedz

26

IIf jest funkcją nie jest równoważny C#”s ?:, który to operator.

Wersja operator istniała przez pewien czas w VB.NET, choć i to właśnie nazywa If:

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

... co jest oczywiście bezprzedmiotowe i powinno być po prostu zapisać jako:

Dim i As Boolean = 1 < 2 

... lub z Option Infer:

Dim i = 1 < 2 
+0

Dzięki za te informacje; bardzo pomocne. Nowy rozwój prawie zawsze robię C#, ale mam też wiele starszych konwersji/aktualizacji (prawie zawsze w VB); nie był świadomy tylko IF (x, x, x) w VB – alykins

+2

@alykins: Nie istnieje w VB, tylko VB.NET, i tylko od 2008 roku. –

6

Ten kod pokazuje różnicę między funkcją IIf a operatorem If. Ponieważ IIf jest funkcją, musi ocenić wszystkie parametry, aby przejść do funkcji.

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