Поделиться через


Согласованное поведение сдвигов в универсальной математике

Сдвиговые операции в общей математике теперь имеют согласованное поведение во всех встроенных целочисленных типах.

Предыдущее поведение

Поведение при использовании универсальных математических функций для выполнения сдвига на 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> или аналогичный интерфейсу.