Зависимые поля при использовании инициализации свойства объекта в 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 еще не назначен

Другие вопросы по тегам