2010-08-16 3 views
0

나는 다음과 같은 것을 할 수 없다는 것을 알게되어 매우 놀랐습니다.C#에서 객체 속성 초기화를 사용할 때 종속 필드들

public class NumberyStuff 
{ 
    public List<int> Numbers { get; set; } 
    public int Total { get; set; } 
} 


var numbers = new NumberyStuff 
{ 
    Numbers = new List<int>{ 1, 2, 3, 4, 5 }, 
    Total = Numbers.Sum() // "Numbers does not exist in the current context" 
} 

일부 구문이 누락 되었습니까? 아니면 불가능한가요?

+0

'Total' 속성은 비논리적입니다. 왜 계산할 수있는 값을 저장하겠습니까? 'Total' setter를 사용하면 어떻게됩니까? – thelost

+0

@thelost : 그것은 단지 ** 예이다 ** dude – fearofawhackplanet

답변

2

이 불가능합니다, 당신은 객체 생성에서 전체 설정을 이동해야합니다

var numbers = new NumberyStuff 
{ 
    Numbers = new List<int>{ 1, 2, 3, 4, 5 }   
} 
numbers.Total = numbers.Numbers.Sum(); 

실제로 분해와 숫자 속성의 초기화에 대해 생성 된 코드를 보면, 당신은 볼 수 있습니다 그것은 모두 임시 변수를 통해 수행된다는 것입니다. 난 당신이 <> g__initLocal1 변수의 합을 생성 할 수 있다는 기술적 이유가 없을 것 같아요 동안

NumberyStuff <>g__initLocal0 = new NumberyStuff(); 
List<int> <>g__initLocal1 = new List<int>(); 
<>g__initLocal1.Add(1); 
<>g__initLocal1.Add(2); 
<>g__initLocal1.Add(3); 
<>g__initLocal1.Add(4); 
<>g__initLocal1.Add(5); 
<>g__initLocal0.Numbers = <>g__initLocal1; 
NumberyStuff numbers = <>g__initLocal0; 

는이 숫자에 배치 된 때까지 당신이 그것을에 접근 할 수없는 구문을 사용할 수있다 목적.

+0

. 컴파일러가 왜 이것을 처리하지 않는지 아십니까? 리퍼 트 (Lippert) 나 다른 컴파일러 전문가 중 한 명이 블로깅 한 적이 있습니까? – fearofawhackplanet

+1

@fearofawhackplanet 귀하의 속성 중 하나가 다른 제안에 의존하는 경우 호출자에게 해당 위치를 밀어 넣는 대신 클래스에서 해당 관계를 시행하지 않는 이유는 무엇입니까? 그 질문에 대한 답이 될 수 있습니다. –

3

조금 비슷하게 보이지만 이니셜 라이저는 이 아니며 ctor가 아니며 호출 루틴의 컨텍스트에 있으므로 this 포인터가 없습니다. 다음과 같이 작성해야합니다 :

// This doesn't work either. 
var numbers = new NumberyStuff 
{ 
    Numbers = new List<int>{ 1, 2, 3, 4, 5 }, 
    Total = numbers.Numbers.Sum() 
} 

제외, numbers은 아직 지정되지 않았습니다.

관련 문제