2010-07-15 5 views
19

string.Format()은 매개 변수가 문자열이고 오버로드 목록에서 다른 매개 변수 중 object[] 또는 많은 객체를 포함합니다.string.Format은 런타임에 정수 배열을 사용하여 실패합니다.

이 문이 성공 :

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

처럼이 :

문자열 배열처럼
object[] myObjs = new object[] {8,9}; 
string baz = string.Format("{0} and {1}", myObjs; 

:

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

정수, 개별적으로 지정된 경우 것 같다을, boxed 또는 강제로 object을 입력 할 수 있으며, 차례로 문자열로 강제 변환됩니다.

이 문은 런타임에서 실패합니다.

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

인덱스 (0부터) 인수 목록의 크기보다 이상인 제로 이하이어야한다.

  • 왜 int 배열은 object[] 또는 string[] 강제 변환 또는 박스 될 수 없거나 무엇입니까?
  • 호기심 때문에 컴파일러가 왜 이것을 잡지 못합니까? 당신은 format에 두 개의 인수를 지정하지만 하나 개의 객체를 지정하는

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

    :

답변

24

호출은 다음도 실패합니다 같은 이유로 실패합니다.

int[]이 함수로 완벽하게 유효한 인수 인 개체로 전달 되었기 때문에 컴파일러에서이를 catch하지 않습니다. 당신은을 사용하는 것 때문에 일 것이다

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

:

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

을 멀리로 얻을 수 그러나 :

또한 당신이 할 수 있도록 해당 배열 공분산 값 유형 작동하지 않습니다 String.Format 오버로드는 object[]을 허용합니다.

+0

AO를 입력 할 수있는 두 번째 인수가없는 것입니다. 'string.Format()'과'string []'의 성공을 포함하도록 질문을 업데이트했습니다. 그것은 int []와 다르지 않습니까? –

+0

@ p.campbell, 값 유형에서 지원되지 않는 배열 공분산에 대한 내 업데이트를 참조하십시오. –

+0

그래서'int []'가 배열이나 객체 배열 대신 객체로 전달되었지만'object []'가 배열로 전달된다는 말입니까? – Jack

0

문자열. 형식에 2 개의 인수 ({0} 및 {1})가 필요합니다. 1 개의 인수 만 제공합니다 (int []). 다음과 같은 것이 필요합니다.

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

런타임시 형식 문자열이 계산되므로 컴파일러에서 문제를 알지 못합니다. IE 컴파일러는 {0}과 {1}이 2 개의 인수가 있어야한다는 것을 알지 못합니다.

0

이 작동 : 그것은 당신의 형식 문자열을 평가하지 않기 때문에

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

컴파일러는 그것을 잡을 수 없습니다.

상단에 포기한 예가 아래에서 시도하려는 것과 일치하지 않습니다 ... 두 개의 {} 및 두 개의 인수를 제공했지만 하단의 인수는 하나만 제공했습니다.

3

귀하의 호출이로 번역됩니다 :

이 문자열 결과
string foo = string.Format("{0} {1}", myInts.ToString()); 

: {1} (으) 매개 변수를 가지고 있지 않는 한

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

그래서, 그것은 예외가 발생

2

문제가있는 개념은 int[]object[]으로 변환되지 않은 이유입니다. 그 이유를 보여주는 예가 여기에 있습니다.

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

문제는 방금 int 배열에 객체를 추가 한 것입니다. 덕분에이 대답 : 코드에서 일어나는 그래서

myIntsobject에 캐스팅하고 {1}

관련 문제