-
Notifications
You must be signed in to change notification settings - Fork 4.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
StringComparison.InvariantCulture behavior change between .NET Core 3.1 and .NET 5 #44687
Comments
Tagging subscribers to this area: @tarekgh, @safern, @krwq Issue Details
|
ICU-related, doesn't reproduce with
|
@EgorBo oh I see, I'm somewhat of a noob to GitHub 😁 |
Thanks @Zintom for reporting the issue. I'm closing it as a dupe of: #44439 Also please look at this issue last comment explaining the reasoning behind the change and we're pointing to the docs that we wrote about the change: #43736 But long story short the reason why we recommend using Ordinal is because culture aware comparisons my give different results in different machines. Also please see: #43956 which explains why there is a lot of confusion in our APIs since some are Ordinal by default and some culture-aware. As a workaround for now you can switch back to NLS or use Ordinal comparison. |
This is not a dupe of #44439. 44439 describes a bug where Here, the API is behaving as speced, but the caller almost certainly intended to perform an ordinal comparison instead of a linguistic comparison. That is, the caller is invoking the wrong overload, but this wasn't apparent until the recent NLS -> ICU switch. I've added it to the list at the top of #43956. |
Thanks, @GrabYourPitchforks for elaborating. |
Yeah my bad @GrabYourPitchforks |
Related issue: dotnet/runtime#44687
Description
Using
StringComparison.InvariantCulture
onstring.LastIndexOf(string, comparison)
returns different results in .NET 5 compared to .NET Core 3.1 when looking for the index of a unicode character.Witness the following code:
On .NET Core 3.1, this assertion is
true
, whereas in .NET 5 this assertion isfalse
. In fact, in .NET 5, theLastIndexOf
method is returning the index of the end of the string whereas in 3.1 it is correctly returning "5
".Supposition
I have tried source stepping into the
LastIndexOf
method but frankly, I do not understand it well enough to make an informed analysis of why this happens :( My supposition is that is something to do withInvariantCulture
and Unicode, because if I change the comparison mode to Ordinal, the assertion is correct in both .NET versions.The text was updated successfully, but these errors were encountered: