Это легко обойти, но мне просто любопытно, могу ли я использовать функцию языка или, возможно, тот факт, что язык запрещает это, означает, что я делаю логическую ошибку в дизайне класса.
Я провожу самопроверку своего кода, чтобы «укрепить» его для повторного использования, и я только что пришел к выводу:
public partial class TrackTyped : Component
{
IContainer components = null;
public TrackTyped()
: base()
{
InitializeComponent();
}
public TrackTyped(IContainer container)
: base()
{
container.Add(this);
InitializeComponent();
}
}
Когда я вижу одну и ту же строку кода в двух конструкторах, я обычно делаю один вызовите другого с помощью "this ()", но я не могу этого сделать.
Если я правильно прочитал спецификацию (я только начал пытаться читать спецификацию, поэтому я могу ошибаться):
10.11 Instance Constructors
constructor-declarator:
identifier ( formal-parameter-listopt ) constructor-initializeropt
constructor-initializer:
: base ( argument-listopt )
: this ( argument-listopt )
Он говорит У меня может быть только один из них.
ВОПРОС: 10.11 означает, что нет причин вызывать оба, или это просто означает, что язык поддерживает только один вызов?
Похоже, это то, что вы хотите:
public partial class TrackTyped : Component
{
IContainer components = null;
public TrackTyped()
: base()
{
InitializeComponent();
}
public TrackTyped(IContainer container)
: this()
{
container.Add(this);
}
}
Порядок операторов во втором конструкторе теперь другой. Если это имеет значение, то на самом деле нет хорошего способа сделать то, что вы хотите, поскольку, даже если у вас одна и та же строка , функциональность немного отличается. В этом случае вам просто нужно будет повторить одну строку. Не парься.
И вы правильно читаете спецификацию: она должна быть одна или другая.