.NET 6中使用CM区域报错的原因及解决办法咨询
问题解答
这是不是C#的Bug?
不是。这是.NET Core/.NET 5+系列版本对RegionInfo构造函数的行为变更导致的,而非C#语言本身的Bug。
在.NET Framework(如4.7.2)中,RegionInfo(string name)构造函数会自动区分传入的是ISO 3166国家代码还是文化代码;但在.NET Core/.NET 5+中,该构造函数的逻辑被调整:如果传入的字符串同时匹配一个中性文化代码(此处"CM"恰好对应喀麦隆的中性文化代码),则会要求传入特定文化代码(如带语言前缀的fr-CM、en-CM),从而抛出参数异常。
修复/规避方案
针对用户输入国家代码的场景,推荐使用.NET Core 3.0及以上提供的RegionInfo.GetRegionInfoByTwoLetterCode(string twoLetterISORegionName)静态方法,该方法专门用于通过ISO 3166两位国家代码获取RegionInfo实例,不会与文化代码逻辑冲突。
修改后的代码示例:
using System; using System.Globalization; public class Program { public static void Main() { var region = RegionInfo.GetRegionInfoByTwoLetterCode("CM"); Console.WriteLine(region.DisplayName); // 输出喀麦隆 } }
如果需要兼容更多场景(比如用户可能输入文化代码或国家代码),可以添加判断逻辑:
public static RegionInfo GetRegionInfo(string code) { try { // 先尝试用构造函数处理文化代码场景 return new RegionInfo(code); } catch (ArgumentException) { // 构造函数失败时,尝试用国家代码专属方法 return RegionInfo.GetRegionInfoByTwoLetterCode(code); } }
内容的提问来源于stack exchange,提问作者manymanymore
相关产品推荐
相关产品推荐

