【问题标题】:Difference between index of List and index of ArrayList索引和Array索引的区别
【发布时间】:2016-09-28 00:31:36
【问题描述】:

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

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

【问题讨论】:

  • 请提及异常详情。
  • 但是为什么你首先需要使用List&lt;string&gt; 呢?你可以使用像var info1 = { "SQLSRV", "TEST", "True", "user1", "pass1" }; 这样的数组初始化器,它会起作用
  • 代码可以简化@Fabjan。也许该列表是在其他地方构建的......
  • 是的,但如果是这样的话,OP应该提到它
  • 标题有点混乱,因为List(T).IndexOfArray.IndexOf(T) 方法,它会误导未来的读者。

标签: c# arrays string list


【解决方案1】:

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

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

在你使用这个的第二秒:

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

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

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

【讨论】:

  • 确实,在这种情况下这是最好的选择。
  • @maxMrScapegracerubanov 是的,这是一种可能。 info1.ToArray() 可以工作。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      你可以从 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&lt;String&gt; 时,整个列表 已被视为 对象数组的第一项,因此Format 失败(您必须提供五个 项)。最简单的补救措施是,恕我直言,通过 Linq 获取一个数组:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        • 2015-05-12
        • 2014-02-18
        • 2019-08-26
        • 1970-01-01
        • 1970-01-01
        • 2015-04-09
        相关资源
        最近更新 更多