C# EndsWith的意外行为

C# EndsWith的意外行为,c#,C#,有人能解释这种行为吗 " ".EndsWith(((char)9917).ToString()) // returns true 使用相同的方法启动。: 字符串比较中使用的区域性敏感排序和大小写规则取决于.NET Framework的版本。在.NET Framework 4中,排序、大小写、规范化和Unicode字符信息与Windows 7同步,并符合Unicode 5.1标准 您使用的字符是Unicode 5.2字符,因此除了那些仅按数字比较字符的函数外,它在任何函数中都可能无法正常工作 您

有人能解释这种行为吗

" ".EndsWith(((char)9917).ToString()) // returns true
使用相同的方法启动。

字符串比较中使用的区域性敏感排序和大小写规则取决于.NET Framework的版本。在.NET Framework 4中,排序、大小写、规范化和Unicode字符信息与Windows 7同步,并符合Unicode 5.1标准

您使用的字符是Unicode 5.2字符,因此除了那些仅按数字比较字符的函数外,它在任何函数中都可能无法正常工作


您应该会在Windows 8和.NET 4.5上看到不同的行为(但我现在无法测试):根据文档,在这种情况下,支持Unicode 6.0。根据Thomas Levesque在评论中的说法,与文档相反,这一点在以后的版本中没有更改。

如评论中所述,如果未提供StringComparison类型,
endswith
方法使用当前区域性

通过使用顺序比较,可以使其正常工作:

.EndsWith(((char)9917.ToString(),StringComparison.Ordinal)//错误


(Ordinal最终将比较字符的
字节
,以确定相等性)

对于每个想知道的人来说:这个字符就是袜子球。根据区域性信息,该字符相当于一个空字符串
string.Equals(((char)9917).ToString,“,StringComparison.CurrentCulture)
也返回
true
。也返回9918和9919的true,但不返回9916或9920的true。有趣的是:
”。Contains((char)9917.ToString())//false
:-)“a”。EndsWith((char)9917.ToString())也返回true。正如@LasseV.Karlsen指出的,字符等于一个空字符串,因此它与“string.EndsWith(“”)”相同。请注意,如果字符串没有标准化,则顺序比较几乎肯定是错误的,即使它们被标准化,比较也可能不是预期的(或者,在其他情况下,很可能是).刚刚在Windows 8.1/.NET 4.5上试用过:结果是一样的。