2010-08-16 71 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 2010-08-16 11:18:44

+0

@thelost:它只是**一個例子**花花公子 – fearofawhackplanet 2010-08-16 11:20:35

回答

2

這是不可能的,你需要移動的總放樣對象建設:

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

如果你真的拆開,看看對數字財產的初始化生成的代碼,你會看到它都是通過臨時變量完成的。

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; 

雖然我想應該沒有技術原因,你不能生成從<> g__initLocal1變量的總和,沒有語法供您訪問它,直到後已放置在數目的。

+0

這很糟糕。你知道爲什麼編譯器不處理這個嗎? Lippert還是其他編譯器專家之一曾經對此進行了博客,你知道嗎? – fearofawhackplanet 2010-08-16 11:22:08

+1

@fearofawhackplanet如果你的其中一個屬性依賴於另一個屬性,爲什麼不在該類中強制實現這種關係,而不是將該責任推給調用者?這很可能是你的問題的答案 – 2010-08-16 11:28:20

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尚未分配。