Зависимые поля при использовании инициализации свойства объекта в 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"
}
Я просто пропускаю какой-то синтаксис? Или это невозможно?
2 ответа
Это невозможно, вам нужно вывести общую настройку из объекта строительства:
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, нет доступного синтаксиса для доступа к ней до тех пор, пока она не будет помещена в объект номеров.
Несмотря на то, что инициализатор похож на единицу, инициализатор не является 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
еще не назначен