StringFormat期间的异常:索引(从零开始)必须大于或等于零且小于参数列表的大小

时间:2016-01-08 11:51:05

标签: c# string.format

我在网站上看到过这样的例子,但是所有的地方持有人都被指错,或者参数和持有人数量不同,我的日志如下所示

Logger.InfoFormat("Successfully connected to outgoing queue for platform {0}. QueueManagerName = {1}, HostName = {2}, ChannelName = {3}, QueueName = {4}", Platform.ID, Platform.MqGatewayParams.QueueManagerName, Platform.MqGatewayParams.HostName, Platform.MqGatewayParams.ChannelName, Platform.MqGatewayParams.OutgoingQueueName);

InfoFormat方法:

public void InfoFormat(string className, string methodName, string format, object arg0, object arg1, object arg2)
    {
        _log4NetLogger.InfoFormat(GetMessageString(className, methodName, format), arg0, arg1, arg2);
    }

并在内部调用GeMessageString

private string GetMessageString(string className, string methodName, object message)
    {
        return string.Format("[{0}::{1}] {2}", className ?? string.Empty, methodName ?? " ", message ?? " ");
    }

任何人都可以告诉我这里我做错了什么吗?

1 个答案:

答案 0 :(得分:2)

使用InfoFormat方法:

_log4NetLogger.InfoFormat(GetMessageString(className, methodName, format), arg0, arg1, arg2);

这只将3格式参数传递给_log4NetLogger.InfoFormat,但您的格式字符串为5。

您需要将params用于可变长度参数列表,如下所示:

void FormatString(string format, params object[] args) {
  String.Format(format, args)
}

(为较短的参数列表提供重载有一个小好处 - 以String.Format本身为例 - 因为不需要分配数组;但除非使用这些函数,否则它是一个小优化很多。)

PS。示例调用者似乎将格式字符串作为InfoFormat的第一个参数传递,但其实现似乎期望参数查找字符串。