-
Notifications
You must be signed in to change notification settings - Fork 724
Closed
Description
Describe the bug
Key
and KeyCode
support equality e.g.
// Passes
Assert.Equal (KeyCode.A, Key.A);
Assert.Equal (KeyCode.F1, Key.F1);
However when casting is involved things behave inconsistently. The most noticeable case is non character values e.g. F1
// Fails
Assert.Equal ((uint)KeyCode.F1, (uint)Key.F1);
The int cast on Key
is going into the 'char' explicit operator which returns 0
Assert.Equal() Failure: Values differ
Expected: 1048587
Actual: 0
But there is also inconsistent behaviour when it comes to lower case letters
// Pass
Assert.Equal (KeyCode.A, Key.A);
Assert.NotEqual (KeyCode.A, Key.A.WithShift);
// Fail
Assert.Equal ((uint)KeyCode.A, (uint)Key.A);
Assert.NotEqual ((uint)KeyCode.A, (uint)Key.A.WithShift);
I think the code is going down the char
route in order to get to uint
and I note that the docs describes this as 'lossy'.
/// <summary>
/// Explicitly cast <see cref="Key"/> to a <see langword="char"/>. The conversion is lossy.
/// </summary>
/// <param name="kea"></param>
public static explicit operator char (Key kea) => (char)kea.AsRune.Value;
Expected behavior
Casting to uint should either be impossible or should be consistent
Metadata
Metadata
Assignees
Labels
No labels