2010-07-15 31 views
19

Xem xét string.Format() có tham số là một chuỗi và, trong số những thứ khác trong danh sách quá tải, object[] hoặc nhiều đối tượng.string.Format không thành công khi chạy với mảng số nguyên

Tuyên bố này thành công:

string foo = string.Format("{0} {1}", 5, 6); 

như thực hiện điều này:

object[] myObjs = new object[] {8,9}; 
string baz = string.Format("{0} and {1}", myObjs; 

cũng như một mảng của chuỗi:

string[] myStrings = new string[] {"abc", "xyz"}; 
string baz = string.Format("{0} {1}", myStrings); 

Dường như số nguyên, khi quy định cá nhân, có thể được đóng hộp hoặc ép buộc để nhập object, do đó bị ép buộc thành một chuỗi.

Tuyên bố này không thành công tại thời gian chạy.

int[] myInts = new int[] {8,9}; 
string bar = string.Format("{0} and {1}", myInts); 

Index (zero based) phải lớn hơn hoặc bằng số không và nhỏ hơn kích thước của danh sách đối số.

  • Tại sao không hoặc có thể không phải là mảng int bị cưỡng chế hoặc đóng hộp đến một object[] hoặc string[]?
  • Hết một chút tò mò, tại sao trình biên dịch không bắt được điều này?

Trả lời

24

Cuộc gọi không thành công với lý do tương tự sau đây cũng sẽ thất bại:

string foo = string.Format("{0} {1}", 5); 

Bạn đang xác định hai đối số trong format nhưng chỉ xác định một đối tượng.

Trình biên dịch không bắt được vì int[] được truyền dưới dạng đối tượng là đối số hoàn toàn hợp lệ cho hàm.

Cũng lưu ý rằng mảng hiệp phương sai không làm việc với các loại giá trị, do đó bạn không thể làm:

object[] myInts = new int[] {8,9}; 

Tuy nhiên bạn có thể nhận được ngay với:

object[] myInts = new string[] { "8", "9" }; 
string bar = string.Format("{0} {1}", myInts); 

mà sẽ làm việc bởi vì bạn sẽ được sử dụng String.Format quá tải chấp nhận object[].

+0

AO: cảm ơn cho câu trả lời này. Tôi đã cập nhật câu hỏi để bao gồm sự thành công của 'string.Format()' với một 'string []'. Có khác biệt gì với 'int []'? –

+0

@ p.campbell, xem cập nhật của tôi về mảng hiệp phương sai không được hỗ trợ trong các loại giá trị. –

+0

Vì vậy, bạn đang nói rằng 'int []' đang được truyền như một đối tượng thay vì như một mảng mảng hoặc đối tượng nhưng 'đối tượng []' sẽ được chuyển thành một mảng? – Jack

0

Chuỗi của bạn.Format đang chờ 2 đối số ({0} và {1}). Bạn chỉ đang cung cấp 1 đối số (int []). Bạn cần một cái gì đó giống như thế này:

string bar = string.Format("{0} and {1}", myInts[0], myInts[1]); 

Trình biên dịch không nhận thấy vấn đề vì chuỗi định dạng được đánh giá khi chạy. Trình biên dịch không biết rằng {0} và {1} có nghĩa là phải có 2 đối số.

0

này hoạt động:

string bar = string.Format("{0} and {1}", myInts[0], myInts[1]); 

Trình biên dịch không bắt nó bởi vì nó không đánh giá chuỗi định dạng của bạn.

Ví dụ bạn bỏ đầu không khớp với những gì bạn đang cố gắng thực hiện bên dưới ... bạn đã cung cấp hai {} và hai đối số, nhưng ở phía dưới bạn chỉ cung cấp một đối số.

3

Cuộc gọi của bạn được dịch sang này:

string foo = string.Format("{0} {1}", myInts.ToString()); 

mà kết quả trong chuỗi này:

string foo = "System.Int32[] {1}"; 

Vì vậy, như {1} không có một tham số, nó ném một ngoại lệ

2

Tôi nghĩ rằng khái niệm mà bạn đang gặp sự cố là lý do tại sao int[] không được truyền tới object[]. Dưới đây là ví dụ cho thấy lý do tại sao điều đó sẽ là xấu

int[] myInts = new int[]{8,9}; 
object[] myObjs = (object[])myInts; 
myObjs[0] = new object(); 

Vấn đề là chúng tôi vừa thêm một đối tượng vào một mảng int.

Vì vậy, những gì xảy ra trong mã của bạn là myInts được đúc để object và bạn không có một cuộc tranh luận thứ hai để điền vào {1}

Các vấn đề liên quan