Крис уже прибил его, vb.net определил операторы сдвига для типов Byte и Short, а C # - нет.Спецификация C # очень похожа на C и также хорошо соответствует определениям MSIL для OpCodes.Shl, Shr и Shr_Un, они принимают только операнды int32, int64 и intptr.Соответственно, любые байты или операнды короткого размера сначала преобразуются в int32 с их неявным преобразованием.
Это ограничение, с которым должен работать компилятор vb.net, он должен генерировать дополнительный код, чтобы сделать байты и короткиеконкретные версии операторов работают.Байт-оператор реализован так:
Dim result As Byte = CByte(leftOperand << (rightOperand And 7))
и оператор короткого вызова:
Dim result As Short = CShort(leftOperand << (rightOperand And 15))
Соответствующая операция C #:
Dim result As Integer = CInt(leftOperand) << CInt(rightOperand)
Или CLng ()если необходимо.В коде C # подразумевается, что программист всегда должен приводить результат к желаемому типу результата.Есть много таких вопросов от программистов, которые не думают, что это очень интуитивно понятно.VB.NET имеет еще одну функцию, которая делает автоматическое приведение более живучим, по умолчанию включена проверка переполнения.Хотя это не относится к сменам.