gpt4 book ai didi

c# - ArgumentOutOfRangeException 的奇怪本地化问题

转载 作者:太空宇宙 更新时间:2023-11-03 11:04:57 24 4
gpt4 key购买 nike

这个“问题”可能很难测试/重现,对于那些安装了英语作为唯一语言的 Windows 版本的人来说。我在安装了“丹麦语(丹麦)”(“da-DK” 文化)、.NET 4.5 版的 Windows 7 机器上执行此操作。

我经历了以下令人惊讶的行为。代码:

Console.WriteLine("Now using intalled UI culture");
Thread.CurrentThread.CurrentUICulture = CultureInfo.InstalledUICulture;
Console.WriteLine(new ArgumentNullException().Message);
Console.WriteLine(new ArgumentOutOfRangeException().Message);

Console.WriteLine();

Console.WriteLine("Now using invariant culture");
Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
Console.WriteLine(new ArgumentNullException().Message);
Console.WriteLine(new ArgumentOutOfRangeException().Message);

产生以下输出:

Now using intalled UI culture
En værdi må ikke være null.
Det angivne argument lå uden for det gyldige værdiområde.

Now using invariant culture
Value cannot be null.
Det angivne argument lå uden for det gyldige værdiområde.

说明:在第一部分中,当 UI 线程为丹麦语时,我们看到了两条预期的本地化异常消息。但在第二部分中,我们看到一条英语(“不变”)消息和一条丹麦语消息,即使 UI 文化不再与丹麦语相关。

我也对很多其他 mscorlib 异常类进行了尝试,看起来只有 System.ArgumentOutOfRangeException 不尊重 UI 文化的变化。

为什么 ArgumentOutOfRangeException 在这方面与其他异常不同?

(如果其他人(其他版本的操作系统和框架,和/或其他语言)看到相同的行为,那将会很有趣。)

附言!将以下行粘贴到同一台机器上的 PowerShell(它针对另一个 .NET 版本)会产生 相反 ArgumentOutOfRangeException 问题?!

[Threading.Thread]::CurrentThread.CurrentUICulture = [Globalization.CultureInfo]::InstalledUICulture; New-Object ArgumentNullException;
[Threading.Thread]::CurrentThread.CurrentUICulture = [Globalization.CultureInfo]::InstalledUICulture; New-Object ArgumentOutOfRangeException;
[Threading.Thread]::CurrentThread.CurrentUICulture = [Globalization.CultureInfo]::InvariantCulture; New-Object ArgumentNullException;
[Threading.Thread]::CurrentThread.CurrentUICulture = [Globalization.CultureInfo]::InvariantCulture; New-Object ArgumentOutOfRangeException;

(保留长行以确保每行的两个语句都由 PowerShell 在同一线程上执行。)

最佳答案

如果您查看这两个异常的源代码,您会很快发现问题所在。下面是 ArgumentNullException 的构造函数:

public ArgumentNullException() : 
base(Environment.GetResourceString("ArgumentNull_Generic")) {
base.SetErrorCode(-2147467261);
}

如您所见,每次都会从资源中加载错误消息。 ArgumentOutOfRangeException 的构造函数如下所示:

public ArgumentOutOfRangeException() : base(RangeMessage) {
base.SetErrorCode(-2146233086);
}

其中 RangeMes​​sage 是私有(private)静态属性:

private static string RangeMessage {
get {
if(_rangeMessage == null) {
_rangeMessage = Environment.GetResourceString(
"Arg_ArgumentOutOfRangeException");
}
return _rangeMessage;
}
}

在这里您可以看到缓存错误消息的问题。所以不会再更新了。我看到的唯一方法是通过反射访问 private static volatile string _rangeMes​​sage; 并将其设置回 null

关于c# - ArgumentOutOfRangeException 的奇怪本地化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16247080/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com