Общим решением является вызов статического метода, принадлежащего типу, который может вычислить значение параметра, передаваемого в базовый конструктор.
Например:
public B(int x, int y)
: base(x, y, CalculateZ(x, y))
{
}
// You can make this parameterless if it does not depend on X and Y
private static int CalculateZ(int x, int y)
{
//Calculate it here.
int exampleZ = x + y;
return exampleZ;
}
Обратите внимание, что CalculateZ
не может быть методом экземпляра, поскольку ссылка this
недоступна в инициализаторах конструктора.
Из спецификации языка 10.11.1 Инициализаторы конструктора:
Инициализатор конструктора экземпляра не может получить доступ к создаваемому экземпляру.Следовательно, это ошибка времени компиляции, чтобы ссылаться на это в выражении аргумента инициализатора конструктора, так же как и ошибка времени компиляции для выражения аргумента, чтобы ссылаться на любой элемент экземпляра через простое имя.
РЕДАКТИРОВАТЬ: в описании изменено «экземпляр» на «статический».