Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Shift operations in generic math now have consistent behavior across all built-in integer types.
Previous behavior
The behavior when utilizing generic math to perform a shift on a T
could differ based on the type. In some cases, it appropriately masked the shift amount by sizeof(T) - 1
. And in other cases, there was no masking. This meant that "overshifting" (such as shifting a byte
by 8) could result in different answers than expected.
New behavior
The implementations were updated to mask the shift amount, as appropriate, to ensure consistent behavior across all built-in integer types and with the behavior documented by the System.Numerics.IShiftOperators<TSelf,TOther,TResult> interface.
Version introduced
.NET 10 Preview 1
Type of breaking change
This change is a behavioral change.
Reason for change
The behavior differed from the designed behavior due to a difference in how masking works for small integer types in C#.
Recommended action
Update any code that relies on the previous inconsistent behavior to ensure it works with the new consistent behavior.
Affected APIs
operator <<
operator >>
operator >>>
forbyte
,char
,sbyte
,short
, andushort
when used via generic math, which requires aT
constrained towhere T : IShiftOperators<T, int, T>
or a similar interface.