Зависимые поля при использовании инициализации свойства объекта в C # - PullRequest
0 голосов
/ 16 августа 2010

Я был сегодня очень удивлен, обнаружив, что я не могу сделать следующее.

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"
}

Мне не хватает какого-то синтаксиса?Или это невозможно?

Ответы [ 2 ]

3 голосов
/ 16 августа 2010

Несмотря на то, что инициализатор похож на единицу, инициализатор имеет значение , а не 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 еще не назначено.

2 голосов
/ 16 августа 2010

Это невозможно, вам нужно вывести общую настройку из объекта строительства:

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

Если вы действительно разберете и посмотрите на сгенерированный код для инициализации свойства Numbers, вы увидите, что все это делается через временные переменные.

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, нет доступного синтаксиса для доступа к ней, пока она не будет помещена в объект чисел. *

...