使用 CultureInfo 发出警告的代码

Posted

技术标签:

【中文标题】使用 CultureInfo 发出警告的代码【英文标题】:Code giving warning with CultureInfo 【发布时间】:2016-01-29 18:54:48 【问题描述】:

我有一个代码向我显示如下警告:

因为 'string.Format(string, object, object)' 的行为可以 根据当前用户的区域设置而有所不同, 将 'MethodName' 中的调用替换为对 'string.Format(IFormatProvider, string, params object[])' 的调用。 如果 'string.Format(IFormatProvider, string, params object[])' 的结果将显示给用户,请指定 'CultureInfo.CurrentCulture' 作为 'IFormatProvider' 参数。 否则,如果结果将被软件存储和访问,例如当它被持久化到磁盘或数据库时,指定 'CultureInfo.InvariantCulture'。

它的代码是

string[] l_array = (from key in nameValueCollection.AllKeys
                    from value in nameValueCollection.GetValues(key)
                    select $"(key)=(value)").ToArray();
return string.Join("&", l_array);

我认为我可以编写文化信息,但我在哪里以及为什么需要它? 或者我还应该改变什么。

【问题讨论】:

我认为警告是不言自明的。 【参考方案1】:

编辑,看起来$"key=value".ToString(CultureInfo.InvariantCulture) 不起作用,我已经更新了我的解决方案。

您可以通过以下方式删除此警告:

string[] l_array = (from key in nameValueCollection.AllKeys
                from value in nameValueCollection.GetValues(key)
                select InvariantCulture($"(key)=(value)"))
               .ToArray();


   ...
   public static string InvariantCulture(IFormattable formattable)
    
        return formattable.ToString(null, CultureInfo.InvariantCulture);
    

【讨论】:

我仍然收到警告 有趣,我试图提供字符串插值的答案,但看起来这可能行不通,@juharr 给出的答案应该适用于使用String.Format 我已经更新了我的解决方案,以包含一种方法,假设您使用的是 .NET 4.6【参考方案2】:

字符串插值(当您在字符串之前使用$ 时)只是string.Format 调用的语法糖,编译器基本上会将其替换为一个。您可以切换到使用 string.Format 的重载,它需要 IFormatProvider 来修复警告。

string[] l_array = (from key in nameValueCollection
                    from value in nameValueCollection.GetValues(key)
                    select string.Format(
                        CultureInfo.InvariantCulture, 
                        "0=1", 
                        key, 
                        value)).ToArray();
return string.Join("&", l_array);

【讨论】:

我在这里收到一条错误消息:。 Could not find an implementation of the query pattern for source type "NameValueCollection'. 'Select' not found. Consider explicitly specifying the type of the range variable 'kvp'. @demostack 我错过了查询。你所拥有的是正确的。您只需要使用string.Format 重载来修复警告。 我试过 Gilgamesh Answer 但我仍然收到同样的警告。 我收到警告说Method 'A(this NameValueCollection)' calls 'string.Format(IFormatProvider, string, object, object)' and does not provide a format item for argument "1, 2". The provided format string is: '"0=1"

以上是关于使用 CultureInfo 发出警告的代码的主要内容,如果未能解决你的问题,请参考以下文章

使用 XCTest 运行测试时有没有办法发出警告?

当 HTML 标签包含在 JavaScript 代码中时,如何使 JSHint 发出警告?

GCC 和 Clang 未对未使用的异常变量发出警告

为啥 FxCop 会在此 C# 代码中发出有关溢出 (CA2233) 的警告?

禁止对 Visual Studio 中的所有项目发出警告

Discord.js 我发出警告命令,使用 FS 写入文件