[英]What is the difference between Index Out of Range Exception and Index Outside the Bounds of Array Exception?
[英]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
想要array : params object[] args
作為第二個參數,當你提供List<String>
, 整個列表被視為對象數組的第一項 ,因此Format
失敗(你必須提供) 五個項目)。 最簡單的補救措施是,恕我直言,通過Linq獲得一個陣列:
Console.WriteLine(String.Format(basis, info1.ToArray()));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.