You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么StartsWith方法仅在我的设备上返回错误运行结果?

问题原因及解决方法

根本原因

你触发的是本地系统文化配置异常导致的字符串比较结果异常,具体逻辑如下:

  • 你调用StartsWith时指定了CultureInfo.GetCultureInfo("no")作为比较规则,此时字符串比较不会逐字符匹配,而是遵循挪威语文化的排序规则判定前缀匹配关系。
  • 你的Windows系统中存储的挪威语(no)文化的排序规则被异常修改,和标准规则不符,所以出现了"caa"不匹配"ca"前缀的异常结果,其他设备用的是标准规则所以运行正常。
  • .NET 5及以上版本在Windows 10 1903及之后系统上默认调用系统内置的ICU区域数据做字符串比较,系统层面的文化配置异常会直接影响比较结果。

验证方法

你可以先改用逐字符序数比较测试,替换判断逻辑为:

if (foo.StartsWith(bar, StringComparison.Ordinal))

如果运行后输出符合预期,即可确认是文化比较规则异常导致的问题。

修复方案

方案1:重置系统区域配置

打开Windows设置,按如下路径操作:

  • 「时间和语言」→「语言&区域」→「管理语言设置」
  • 切换到「区域选项」标签页,点击「重置」按钮清除所有自定义区域设置
  • 重启电脑后再次运行代码验证

方案2:强制程序使用NLS比较规则

如果不想修改系统配置,可在项目层面强制指定使用传统NLS区域规则,不走系统ICU数据:

  1. 方法一:修改项目文件,加入如下配置:
<ItemGroup>
  <RuntimeHostConfigurationOption Include="System.Globalization.UseNls" Value="true" />
</ItemGroup>
  1. 方法二:在程序入口函数的最开头添加如下代码:
AppContext.SetSwitch("System.Globalization.UseNls", true);

内容的提问来源于stack exchange,提问作者noocyte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 12:27:07