Статическое поле только для чтения не может быть назначено (кроме статического конструктора) - PullRequest
1 голос
/ 24 апреля 2011
abstract class DirectiveNode
{
    public static readonly RequirementOptions ArgumentOptions = RequirementOptions.Optional;
}

class IfNode : DirectiveNode
{
    static IfNode()
    {
        ArgumentOptions = RequirementOptions.Required; // error here
    }

Я не понимаю проблемы. Я думал static IfNode() был статическим конструктором? Почему ошибка?


Только что нашел это: Назначение статического поля только для чтения базового класса

Ответы [ 2 ]

4 голосов
/ 24 апреля 2011

Вы можете назначить его только в статическом конструкторе того же класса .

Кстати, похоже, вы ожидаете, что статическое поле будет содержать разные значения в зависимости от того, какой производный классВы говорите о.Это не так, как это работает.Будет существовать только один экземпляр поля, и он будет использоваться всеми производными классами.

3 голосов
/ 24 апреля 2011

В отличие от нестатических конструкторов, статический конструктор подкласса не связан с родительским статическим конструктором. Если вы хотите, чтобы подкласс мог изменять значение ArgumentOptions, используемое функциями базового класса, рассмотрите виртуальное свойство:

abstract class DirectiveNode
{
    public virtual RequirementOptions ArgumentOptions
    {
        get { return RequirementOptions.Optional; }
    }
}

class IfNode : DirectiveNode
{
    public override RequirementOptions ArgumentOptions
    {
        get { return RequirementOptions.Required; }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...