List的索引与Array的索引之间的区别

时间:2016-05-30 08:41:17

标签: c# arrays string list

在我的应用程序中构建连接字符串时,我遇到了一些比较混乱的异常。

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的索引出了什么问题?

4 个答案:

答案 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()));