为什么 string.Format 不抛出 ArgumentNullException?

Why string.Format does not throw ArgumentNullException?

根据 MSDN String.Format 如果格式为 null(相当合理)则抛出,link here.

但测试表明它仅在第二个参数也为 null 时才执行此操作,而不是在填充第二个参数时执行此操作。

以下不抛出:

string test = string.Format(null, "string");

以下抛出抱怨第一个参数(格式):

string test = string.Format(null, null);

使用 JustDecompile 进一步挖掘源代码调用以下方法:

 private static string FormatHelper(IFormatProvider provider, string format, ParamsArray args)
 {
    if (format == null)
    {
        throw new ArgumentNullException("format");
    }
    return StringBuilderCache.GetStringAndRelease(StringBuilderCache.Acquire(format.Length + args.Length * 8).AppendFormatHelper(provider, format, args));
 }

这没有意义,因为 format 为 null 并且没有抛出异常。有什么提示吗?

啊,重载决议的乐趣。在这种情况下,您实际上是在调用 string.Format(IFormatProvider, string, params object[]) - 因此您为 provider 参数传递了一个空参数,这是完全有效的(并且意味着使用当前的文化)。

重载是 "better" 因为第二个参数从字符串文字到 string 的转换比从字符串文字到 object.

的转换要好

如果您使用参数名称强制正确重载,请加载:

string text = string.Format(format: null, arg0: "string");

...然后它会按预期抛出异常。