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

CultureInfo.GetCultures(AllCultures)为何缺失部分有效区域性?

问题背景

运行环境为Windows 10、.NET Framework 4.6.1时存在如下现象:可成功创建sr-Cyrl-CS、sr-Latn-CS两个有效的CultureInfo实例,但这两个实例对应的区域性名称不会出现在CultureInfo.GetCultures(CultureTypes.AllCultures)的返回结果集中,对应集合成员判断返回值均为false。
使用的测试代码如下:

var allCultureNamesHashSet = new HashSet<string>(CultureInfo.GetCultures(CultureTypes.AllCultures).Select(ci => ci.Name));
var ci1 = new CultureInfo("sr-Cyrl-CS");
var ci2 = new CultureInfo("sr-Latn-CS");
var b1 = allCultureNamesHashSet.Contains(ci1.Name); //false
var b2 = allCultureNamesHashSet.Contains(ci2.Name); //false
问题根因
  • 两个名称属于已废弃的非标准区域性别名
    2006年塞尔维亚和黑山解体后,原ISO 3166分配给塞尔维亚和黑山的国家代码CS正式作废,后续标准区域性名称统一使用代表塞尔维亚的RS、代表黑山的ME作为国家后缀,对应正式有效的塞尔维亚相关区域性为sr-Cyrl-RS、sr-Latn-RS、sr-Cyrl-ME、sr-Latn-ME,sr-Cyrl-CS、sr-Latn-CS属于遗留旧名称,不再是当前生效的标准区域性标识。
  • CultureInfo实例创建与全量枚举的逻辑规则不一致
    为了兼容旧版本程序,.NET Framework在CultureInfo构造函数中内置了旧名称映射逻辑:传入已废弃的sr-Cyrl-CS、sr-Latn-CS名称时不会抛出异常,会自动映射到当前有效的塞尔维亚对应区域性,返回可用实例;但CultureInfo.GetCultures(CultureTypes.AllCultures)接口的逻辑是枚举当前版本.NET和操作系统正式注册、对外公开的有效标准区域性,这类仅做向下兼容的旧别名不会被纳入枚举范围。
  • Windows 10系统本身已过滤废弃区域性
    Windows 10的系统区域性列表中已经移除了所有带CS后缀的废弃塞尔维亚区域性,.NET调用系统原生接口枚举全量区域性时,本身就无法获取到这两个旧名称对应的条目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:42:18