mirror of
https://github.com/ppy/osu.git
synced 2024-12-17 05:22:54 +08:00
cefbc76490
Closes https://github.com/ppy/osu/issues/29738.
This "regressed" in https://github.com/ppy/osu/pull/29639, but if I
didn't know better, I'd go as far as saying that this looks like a .NET
bug, because the fact that PR broke it looks not sane.
The TL;DR on this is that before the pull in question, the offending
`.Contains()` check that this commit modifies was called on a
`List<BeatmapSetInfo>`. The pull changed the collection type to
`BeatmapSetInfo[]`. That said, the call is a LINQ call, so all good,
right?
Not really. First off, the default overload resolution order means that
the previous code would call `List<T>.Contains()`, and not
`Enumerable.Contains<T>()`. Then again, why would that matter? In both
cases `T` is still `BeatmapSetInfo`, right? Well... about that...
It is difficult to tell for sure what precisely is happening here,
because of what looks like runtime magic. The end *symptom* is that the
old code ended up calling `Array<BeatmapSetInfo>.IndexOf()`, and the new
code ends up calling... `Array<object>.IndexOf()`.
So while yes, `BeatmapSetInfo` implements `IEquatable` and
the expectation would be that `Equals<BeatmapSetInfo>()` should be
getting called, the type elision to `object` means that we're back to
reference equality semantics, because that's what
`EqualityComparer.Default<object>` is.
A five-minute github search across dotnet/runtime yields this:
|
||
---|---|---|
.. | ||
Carousel | ||
Details | ||
Filter | ||
Leaderboards | ||
Options | ||
BeatmapCarousel.cs | ||
BeatmapClearScoresDialog.cs | ||
BeatmapDeleteDialog.cs | ||
BeatmapDetailArea.cs | ||
BeatmapDetailAreaDetailTabItem.cs | ||
BeatmapDetailAreaLeaderboardTabItem.cs | ||
BeatmapDetailAreaTabControl.cs | ||
BeatmapDetailAreaTabItem.cs | ||
BeatmapDetails.cs | ||
BeatmapInfoWedge.cs | ||
BeatmapInfoWedgeBackground.cs | ||
BeatmapInfoWedgeV2.cs | ||
FilterControl.cs | ||
FilterCriteria.cs | ||
FilterQueryParser.cs | ||
Footer.cs | ||
FooterButton.cs | ||
FooterButtonMods.cs | ||
FooterButtonOptions.cs | ||
FooterButtonRandom.cs | ||
LocalScoreDeleteDialog.cs | ||
ModSpeedHotkeyHandler.cs | ||
NoResultsPlaceholder.cs | ||
PlayBeatmapDetailArea.cs | ||
PlaySongSelect.cs | ||
SkinDeleteDialog.cs | ||
SongSelect.cs | ||
SongSelectTouchInputDetector.cs | ||
WedgeBackground.cs |