Свойства устанавливаются для Name и Age после завершения работы конструктора public Person ().
Person person = new Person { Name = "David", Age = "29" };
эквивалентно
Person tempPerson = new Person()
tempPerson.Name = "David";
tempPerson.Age = "29";
Person person = tempPerson;
Итак, в конструкторе Age еще не станет 29.
(tempPerson - это уникальное имя переменной, которое вы не видите в своем коде, которое не будет конфликтовать с другими экземплярами Person, созданными таким образом. TempPerson необходим, чтобы избежать проблем с многопоточностью; его использование гарантирует, что новый объект становится доступным для любого другого потока до тех пор, пока конструктор не будет выполнен и все свойства не будут инициализированы.)
Если вы хотите иметь возможность манипулировать свойством Age в конструкторе, тогда я предлагаю вам создать конструктор, который принимает в качестве аргумента возраст:
public Person(string name, int age)
{
Name = name;
Age = age;
// Now do something with Age
int x = Age;
// ...
}