Как и почему ObsoleteAttribute запрещен для средств доступа к свойствам? - PullRequest
8 голосов
/ 12 мая 2010

Рассмотрим этот сценарий:

public class C
{
    private int _foo;

    public int Foo
    {
        get { return _foo; }

        [Obsolete("Modifying Foo through the setter may corrupt hash tables.  "
            + "Consider using the method 'ModifyFoo' instead.")]
        set { _foo = value; }
    }

    public C ModifyFoo( int foo )
    {
        // return a new instance of C
    }
}

Который не компилируется:

ошибка CS1667: атрибут «Устаревший» недопустим для свойств или средств доступа к событиям. Он действителен только для объявлений класса, структуры, перечисления, конструктора, метода, свойства, индексатора, поля, события, интерфейса, делегата.

Применение атрибутов к определенным методам доступа прекрасно подходит для любого другого атрибута (при условии, что AttributeTargets.Method установлен в его использовании, что верно для ObsoleteAttribute).

Ответы [ 3 ]

7 голосов
/ 12 мая 2010

Понятно, что это компилятор, явно запрещающий его использование, это не случайно. Хма, а почему? Обходной путь для ограничения в компиляторе кажется довольно маловероятным. Я предполагаю, что они решили запретить это, чтобы избежать путаницы с программистом, который получает предупреждение. Если сообщение не было хорошо обработано, было бы очень странно, что оно будет отображаться непоследовательно, в зависимости от использования свойства.

1 голос
/ 12 мая 2010

Почему бы вам просто не изменить свойство, чтобы использовать код в ModifyFoo?

1 голос
/ 12 мая 2010

В этом случае, если вы собираетесь сделать его устаревшим, разве вы не включите его? Суть устаревшего флага - сказать, что есть другой (и лучший способ сделать что-то).

В этом случае вы, вероятно, захотите внести изменения в критическое изменение и заставить людей обновить код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...