为什么`GetFormat`被调用两次?

时间:2018-05-17 14:53:42

标签: c# .net

我有一个IFormatProvider,它会记录它传递的类型:

internal class LoggingFormatProvider : IFormatProvider
{
    public object GetFormat(Type formatType)
    {
        WriteLine($"  formatType: {formatType.FullName}");
        return null;
    }
}

当我用这段代码打电话时:

var myLoggingProvider = new LoggingFormatProvider();
string.Format(myLoggingProvider, "123: {0}", 123);

它输出两个GetFormat方法的调用:

formatType: System.ICustomFormatter
formatType: System.Globalization.NumberFormatInfo

为什么有两个电话?

对于格式化类型的内容,我通常会对什么叫做什么感到困惑。

1 个答案:

答案 0 :(得分:2)

当您调用string.Format(myLoggingProvider, "123: {0}", 123)时,.NET首先会询问您的LoggingFormatProvider实例是否可以提供自定义格式化程序(即ICustomFormatter的实例)。由于它不能(您返回null),并且要格式化的值是一个数字,因此它会回退到请求NumberFormatInfo的实例。

如果您的参数是DateTime的实例,则会收到DateTimeFormatInfo实例的请求。数字和日期显然是唯一可以获得此类后备的参数类型,正如the documentation for IFormatProvider似乎暗示的那样。