2013-05-16 2 views
4

내가 이해하는 것처럼 C#에는 배열을 쓰는 구문이있다 : { 1, 2, 3 }. 이 내용이 유효하지 않은 이유는 무엇입니까?배열이 특정 장소에서만 허용되는 이유는 무엇입니까?

x = { 1, 2, 3 }.GetLength(0); 

이것이 유효한 이유는 무엇입니까?

int[] numbers = { 1, 2, 3 }; 
x = numbers.GetLength(0); 

numbers와 같은 표현 { 1, 2, 3 }의 데이터 유형 아닌가?

+0

아마도 좋은 답변을 얻을 수 있습니다. http://msdn.microsoft.com/en-us/library/vstudio/bb384062.aspx –

답변

7

참조하는 구문은 개체 컬렉션 이니셜 라이저입니다. 다른 유형의 인스턴스를 초기화 할 때 유용합니다. 주어진 유형의 인스턴스를 생성하는 것은 아닙니다.

List<int> nums = new List<int> { 1, 2, 3 }; 

사전 :

Dictionary<string, int> pairs = { { "One", 1 }, { "Two", 2 }, { "Three", 3 } }; 

당신은 여전히 ​​인라인 일들이 초기 의도를 달성 할 수

int[] nums = new int[] { 1, 2, 3 }; 

목록 :

예를 들어, 배열을 선언하는 데 사용할 수 있습니다 코드가 조금 더 있습니다 :

new[] { 1, 2, 3 }.GetLength(0); 
+0

아니요, 개체 이니셜 라이저가 아닙니다. 그것은 배열 이니셜 라이저입니다. –

+0

@JonSkeet - 기술적으로 컬렉션 초기화 도구가 아닌가요? –

+1

아니요, 자체적으로가 아니라 OP가 지정한 컨텍스트가 아닙니다. 내 대답에 대한 스펙 참조를 추가했습니다. 컬렉션 이니셜 라이저는 객체 이니셜 라이저 표현식의 일부입니다. 이는 단순히 배열 이니셜 라이저입니다. (개체 이니셜 라이저와 컬렉션 이니셜 라이저는 C# 3에서만 추가되었지만 C# 1부터는 컬렉션 초기화 프로그램이 유효하다는 것을 명심하십시오.) –

9

배열은 어디서나 사용할 수 있습니다 -하지만 당신은 단지 변수 선언의 일부로 만들기위한 배열 이니셜 라이저 호출되는 (특정 구문을 사용할 수 있습니다 - 또는 더 큰 표현의 일부로서 배열 생성 식을 호출.

당신은 아직 생각을 만들 수 있습니다 : 그 안에 그래서

x = new int[] { 1, 2, 3 }.GetLength(0); 

new int[] { 1, 2, 3 } 배열 생성 식이고, { 1, 2, 3 } 부분은 배열 이니셜 라이저입니다.

배열 작성 표현식은 C# 5 스펙의 7.6.10.4 절에 설명되어 있으며 배열 초기화 프로그램은 12.6 절에 설명되어 있습니다.

2

x = new[] { 1, 2, 3 }.GetLength(0);{1, 2, 3}이 자체 배열이 아니기 때문에 원하는 것을 얻습니다. 오히려 배열 초기화 프로그램입니다. 그리고 GetLength()은 전자는 작동하지만 후자는 작동하지 않습니다.

관련 문제