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 ?? " ");
}
有人能告诉我我在这里做错了什么吗?
在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
的第一个参数,但其实现似乎期望参数查找该字符串。