Skip to content

[Breaking Change] Generic math shifts should use the appropriate mask #43303

Closed
@tannergooding

Description

@tannergooding

Description

Introduced with dotnet/runtime#103900

Version

.NET 10 Preview 1

Previous Behavior

The behavior when utilizing generic math to perform a shift on a T could differ based on the type. In some case it would appropriately mask the shift amount by sizeof(T) - 1 and in other cases it would do no masking. This meant that "overshifting" (such as shifting a byte by 8) could result in different answers being produced 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 IShiftOperators interface.

Reason for change

The behavior differed from the designed behavior due to a difference in how masking works for small integer types in C#.

Feature Area

Numerics

Affected APIs

operator <<, operator >>, and operator >>> for byte, char, sbyte, short, and ushort when used via Generic Math, which requires a T constrained to where T : IShiftOperators<T, int, T> or a similar interface.


Associated WorkItem - 360644

Metadata

Metadata

Assignees

Labels

🏁 Release: .NET 10Work items for the .NET 10 release📌 seQUESTeredIdentifies that an issue has been imported into Quest.breaking-changeIndicates a .NET Core breaking changein-prThis issue will be closed (fixed) by an active pull request.

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions