То, что вы видите, это унаследованный код, показывающий его голову.
В основе этого вопроса лежит тип VT_BOOL. Visual Basic 6.0 использовал тип VT_BOOL (AKA VARIANT_BOOL) для своих логических значений. Истина для VARIANT_BOOL представлена значением VARIANT_TRUE, которое имеет целочисленное значение -1. Во время преобразования в .NET было решено, что при использовании подпрограмм преобразования Visual Basic для преобразования логического значения в целочисленное значение семантика Visual Basic 6.0 будет сохраняться для возвращаемого значения; это будет -1.
Первое неявное преобразование происходит со строкой b = i. Под капотом это делает неявное преобразование из целого числа в логическое. Любое ненулевое значение считается истинным, поэтому полученное значение является истинным.
Однако следующая строка кода выполняет неявное преобразование в целочисленный тип.
i = b
В этом случае используется одна из процедур преобразования Visual Basic ( CType или CInt ) для преобразования значения в целое число. Таким образом, семантика Visual Basic находится в игре, и возвращаемое значение равно -1.
Следующая интересная строка - строка Convert.ToInt32()
. Это использует подпрограмму преобразования .NET, которая не использует семантику Visual Basic. Вместо этого он возвращает базовое представление BCL для истинного логического значения, равного 1.