在我的应用程序中构建连接字符串时,我遇到了一些比较混乱的异常。
string basis = "Data Source={0};Initial Catalog={1};Persist Security Info={2};User ID={3};Password={4}";
List<string> info1 = new List<string>(){ "SQLSRV", "TEST", "True", "user1", "pass1" };
string[] info2 = new string[] { "SQLSRV", "TEST", "True", "user1", "pass1" };
// throws exception
Console.WriteLine(String.Format(basis, info1));
// works fine
Console.WriteLine(String.Format(basis, info2));
错误:
未处理的类型&#39; System.FormatException&#39;发生在mscorlib.dll
附加信息:索引(从零开始)必须大于或等于零且小于参数列表的大小。
我的问题是:List的索引出了什么问题?
答案 0 :(得分:8)
这与索引无关。在第一种情况下,您使用String.Format
的重载:
public static void Format(string format, object arg);
在第二个中你使用它:
public static void Format(string format, params object[] args);
因此,在第一种情况下,您只传递一个参数。这会导致异常,因为您的格式字符串需要多个参数。
在第二种情况下,您提供所有参数,因为传递数组而不是仅传递一个List
对象。
答案 1 :(得分:3)
它将列表视为单个参数。该数组被视为params object[] ...
参数,提供多个参数值。
问题在于String.Format
方法的声明:第一个需要String Format(String format, object arg0)
,而第二个需要string Format(String format, params object[] args)
。
这使得第一个失败,因为它期望索引比你提供的索引更多。
答案 2 :(得分:3)
方法{ "geometry": {
"$geoIntersects": {
"$geometry": {
"type": "Polygon",
"coordinates": coordinate
}
}
}}
接受string.Format()
作为参数来替换格式字符串的占位符。
object[]
不是数组,因此它被视为单个对象。因此,这会导致异常,因为您提供的参数少于格式字符串中的占位符。
答案 3 :(得分:3)
从MSDN可以看到
https://msdn.microsoft.com/en-us/library/b1csw23d(v=vs.110).aspx
public static string Format(string format,params object [] args)
String.Format
希望 array :params object[] args
作为第二个参数,当您提供List<String>
整个列表时被视为对象数组的第1项,因此Format
失败(您必须提供 5个项目)。最简单的补救措施是,恕我直言,通过Linq获得一个阵列:
Console.WriteLine(String.Format(basis, info1.ToArray()));