Согласованное поведение сдвигов в универсальной математике
Сдвиговые операции в общей математике теперь имеют согласованное поведение во всех встроенных целочисленных типах.
Предыдущее поведение
Поведение при использовании универсальных математических функций для выполнения сдвига на T
может отличаться в зависимости от типа. В некоторых случаях оно соответствующим образом маскировало величину сдвига на sizeof(T) - 1
. И в других случаях маскировка не была. Это означало, что "чрезмерный сдвиг" (например, сдвиг byte
на 8) может привести к различным результатам, чем ожидалось.
Новое поведение
Реализации были обновлены, чтобы маскировать величину сдвига при необходимости, чтобы обеспечить согласованное поведение во всех встроенных целочисленных типах и поведение, задокументированное интерфейсом System.Numerics.IShiftOperators<TSelf,TOther,TResult>.
Представленная версия
.NET 10 (предварительная версия 1)
Тип изменения, нарушающего совместимость
Причина изменения
Поведение отличается от поведения, разработанного из-за разницы в том, как маскирование работает для небольших целых типов в C#.
Рекомендуемое действие
Обновите любой код, основанный на предыдущем несогласованном поведении, чтобы обеспечить работу с новым согласованным поведением.
Затронутые API
operator <<
operator >>
-
operator >>>
дляbyte
,char
,sbyte
,short
иushort
при использовании с помощью обобщённой математики, для которой требуетсяT
, ограниченныйwhere T : IShiftOperators<T, int, T>
или аналогичный интерфейсу.