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

5

在我的应用程序中构建连接字符串时,我遇到了一些非常奇怪的异常。

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


请提供异常详细信息。 - Yogi
提供的细节越多,回答就会越好。假设他使用原始代码,并且List<string>没有在Main之外构建。 如果知道这一点,那么最简单的答案是使用字符串数组。 - Fabjan
@Fabjan 代码已经简化,我只是展示了这个异常的一个例子。 - Mr Scapegrace
@maxMrScapegracerubanov 好的,在这种情况下使用 .ToArray() 就足够了。 - Fabjan
1
标题有些令人困惑,因为List(T).IndexOfArray.IndexOf(T)方法的存在,会误导未来的读者。 - Tim Schmelter
显示剩余4条评论
4个回答

8

这与索引无关。在您的第一个案例中,您使用了String.Format的此重载:

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

在第二种方法中,您可以这样使用:

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

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

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


1
确实,在这种情况下那是最佳选择。 - Patrick Hofman
@maxMrScapegracerubanov 是的,那是一个可能性。info1.ToArray() 可以起作用。 - René Vogt

3

它将列表视为单个参数。数组被视为params object[] ...参数,提供多个参数值。

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

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


3
方法string.Format()接受一个object[]作为参数,用于替换格式字符串中的占位符。 List不是数组,因此被视为单个对象。这导致异常,因为您提供的参数少于格式字符串中的占位符数。

3

根据MSDN的内容,可以看出:

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

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

String.Format需要传递 数组:参数二为 params object[] args,但如果你提供了一个 List<String>,则整个列表会被视为对象数组中的 第一个元素,因此导致 Format 失败(需要提供 5 个 参数)。最简单的方法是使用 Linq 获取一个数组:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接