为什么string.Format不会抛出ArgumentNullException?

时间:2017-10-23 16:34:29

标签: c# .net string .net-4.6

根据MSDN,如果format为null(非常合理),则抛出String.Format,link here.

但测试说它只会在第二个参数为空时才会这样做,而不是第二个参数是否填充。

以下内容不会抛出:

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));
 }

这没有任何意义,因为格式为null并且不会抛出异常。任何提示?

1 个答案:

答案 0 :(得分:9)

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

该重载“更好”,因为将第二个参数从字符串文字转换为string要好于从字符串文字到object的转换。

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

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

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