2010-01-07 2 views
25

이 일을 할 때 나는 이상한 오류를 받고 있어요 초기화 :목록 인라인

public overrides List<String> getSpaceballs 
{ 
    get { return new List<String>() { "abc","def","egh" }; } 
} 

VS는 ();을 요청한다 (.NET 2.0). 왜?

확실이 작업을 수행 할 수 있습니다

public overrides string[] getSpaceballs 
{ 
    get { return new string[] { "abc","def","egh" }; } 
} 

답변

6

첫 번째 옵션은 불법입니다 :)

에만 배열에 initialiser의 유형을 할 수 있습니다.

- 편집 : Andrew Hare's 게시글 (및 기타, 아래 참조)을 참조하십시오. v3 이상에서만 사용할 수 있습니다.

- 다시 편집 : 컴파일러가 3 이상 인 경우가 앤드류를 보여줍니다 코드에 아래로 컴파일 있기 때문에, 당신은 (2.0 타겟팅 할 수 있습니다이 작업을 얻기 위해,

그냥 아래, 명확하게하기). 하지만 컴파일러가 2라면, 그렇게 할 수 없습니다.

+2

컬렉션 초기화 프로그램은 C# 3.0에 추가되었습니다. –

+0

프레임 워크 버전 2.0과 관련하여 프레임 워크 버전과 컴파일러 버전을 구분할 수 있습니까? –

+0

야닉 : 뭐라 구요? 나는 네가 의미하는 것을 이해하지 못한다. Andrew의 게시물을 검토하는 표시가 충분하다고 생각합니다. OP와 관계없이 2.0을 사용하고 있음을 분명히했습니다. –

57

C#의 collection initialization syntax은 버전 3 이상에서만 지원됩니다 (.NET 2.0을 언급 했으므로 C# 2도 사용하고 있다고 가정합니다). C#이 항상 배열 초기화와 비슷한 구문을 지원했기 때문에 다소 혼란 스러울 수 있지만 실제로는 그렇지 않습니다.

컬렉션 이니셜 라이저가 만든이 같은 하나 개의 문장에서 컬렉션을 초기화 할 수있는 컴파일러 트릭입니다

List<String> <>g__initLocal0 = new List<String>(); 
<>g__initLocal0.Add("foo"); 
<>g__initLocal0.Add("bar"); 
List<String> list = <>g__initLocal0; 

그러나이 문장은 이것에 컴파일러에 의해 번역됩니다

var list = new List<String> { "foo", "bar" }; 

보시다시피이 기능은 패턴을 단일 표현식으로 단순화하는 구문 설탕입니다.

1

사용중인 VS 버전은 무엇입니까? 그것은 C# 3.0의 합법적 인 구문이므로 VS2005를 사용하는 경우에는 해당 오류가 발생합니다.

+0

BFree : 단지 FY, 중요한 VS 버전이 아닙니다. 컴파일러 버전입니다 (OP에서는 POST의 .net 2라고 말합니다). –

+1

@silky : VS 버전은 사용중인 컴파일러와 관련이 있습니다. VS2005 (C# 3.0)에서 2.0을 대상 프레임 워크로 사용하여 위의 명령문을 컴파일 할 수 있습니다. –

+0

Yannick : 예, 컴파일러 버전 * 때문입니다. 주의 깊게 읽으십시오. –

5

다른 사용자가 지적했듯이 2.0에서는 지원되지 않습니다. 그러나 다음을 수행하여이를 모방 할 수 있습니다.

public overrides List<String> getSpaceballs 
{ 
    get { return new List<String> (new String[] {"abc","def","egh"}); } 
} 

일부 계산상의 오버 헤드가 발생합니다.

관련 문제