Условие, если различия в С# и VB
Почему условно, если в 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))
Я не понимаю, почему С# выполнит преобразование и почему VB этого не делает. Должен Я выполняю свои условия С#, например
bool i = Convert.ToBoolean((1<2)? True: False);
int x = Convert.ToInt32(i? 5:6);
Кроме того, да, я знаю, что IIF возвращает объект типа, но я бы предположил, что С# делает так же, как вы можете вернуть больше, чем просто True | False; мне кажется, что С# обрабатывает неявное преобразование.
Ответы
Ответ 1
IIf
является функцией и не эквивалентна С# s ?:
, которая является оператором.
Операционная версия существует некоторое время в VB.NET, и она называется If
:
Dim i As Boolean = If(1 < 2, True, False)
... что, конечно, бессмысленно и должно быть просто записано как:
Dim i As Boolean = 1 < 2
... или, с Option Infer
:
Dim i = 1 < 2
Ответ 2
Этот код покажет вам разницу между функцией 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