Условие, если различия в С# и 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