繁体   English   中英

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

[英]Difference between index of List and index of Array

在我的应用程序中构造连接字符串时,我遇到了一些相当异常的异常。

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));

错误:

mscorlib.dll中发生了未处理的“System.FormatException”类型异常

附加信息:索引(从零开始)必须大于或等于零且小于参数列表的大小。

我的问题是:List的索引有什么问题?

这与索引无关。 在第一种情况下,您使用String.Format重载:

public static void Format(string format, object arg);

在第二个你使用这个:

public static void Format(string format, params object[] args);

所以在第一种情况下你只传递一个参数。 这会导致异常,因为您的格式字符串需要多个参数。

在第二种情况下,您提供所有参数,因为传递的是数组而不是一个List对象。

它将列表视为单个参数。 该数组被视为params object[] ...参数,给出了多个参数值。

问题出在String.Format方法的声明中:第一个采用String Format(String format, object arg0) ,而第二个采用string Format(String format, params object[] args)

这使得第一个失败,因为它期望索引比你提供的索引更多。

方法string.Format()接受一个object[]作为参数来替换格式字符串的占位符。

List不是数组,因此它被视为单个对象。 因此,因为您提供的参数少于格式字符串中的占位符,因此会导致异常。

正如您从MSDN中看到的那样

https://msdn.microsoft.com/en-us/library/b1csw23d(v=vs.110).aspx

public static string格式(字符串格式,params object [] args)

String.Format想要arrayparams object[] args作为第二个参数,当你提供List<String>整个列表被视为对象数组的第一项 ,因此Format失败(你必须提供) 五个项目)。 最简单的补救措施是,恕我直言,通过Linq获得一个阵列:

Console.WriteLine(String.Format(basis, info1.ToArray()));    

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM