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

本文关键字:等于零 小于 参数 列表 大于 异常 索引 从零开始 StringFormat | 更新日期: 2023-09-27 18:29:26

我在网站上见过几个这样的例子,但所有的占位符都有错误,因为占位符的名称是错误的,或者参数和占位符的数量不同,我的日志线如下

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

有人能告诉我我在这里做错了什么吗?

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

InfoFormat方法中,您有:

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

这只向_log4NetLogger.InfoFormat传递了3个格式参数,但您的格式字符串有5个。

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

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

(为较短的参数列表提供过载有一个小好处——以String.Format本身为例——因为不需要分配阵列;但除非大量使用这些功能,否则这只是一个小的优化。)

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