mirror of
https://github.com/ppy/osu.git
synced 2024-12-17 15:33:04 +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:
|
||
---|---|---|
.. | ||
Backgrounds | ||
Edit | ||
Footer | ||
Import | ||
Menu | ||
OnlinePlay | ||
Play | ||
Ranking | ||
Select | ||
SelectV2 | ||
Spectate | ||
Utility | ||
BackgroundScreen.cs | ||
BackgroundScreenStack.cs | ||
IHandlePresentBeatmap.cs | ||
IHasSubScreenStack.cs | ||
IOsuScreen.cs | ||
IPerformFromScreenRunner.cs | ||
Loader.cs | ||
OsuScreen.cs | ||
OsuScreenDependencies.cs | ||
OsuScreenStack.cs | ||
ScorePresentType.cs | ||
ScreenWhiteBox.cs | ||
StartupScreen.cs |