Атрибут IndexerName в абстрактных классах - PullRequest
5 голосов
/ 10 августа 2011

Я пытаюсь переименовать свое свойство indexer, используя атрибут IndexerName в моих абстрактных классах.Но он по-прежнему показывает ошибку компиляции Тип «XXX» уже содержит определение для «Item» .

Абстрактный класс:

public abstract class MyAbstract
{
    [IndexerName("Indexer")]
    public abstract string this[string propertyName]
    {
        get;
    }
}

Конкретный класс:

public class MyConcrete : MyAbstract
{
    string item;

    public string Item
    {
        get { return item; }
        set { item = value; }
    }

    public override string this[string propertyName]
    {
        get { return propertyName; }
    }
}

Ошибка компиляции:

Тип «MyConcrete» уже содержит определение для «Item».

У меня естьпопытался поместить IndexerName в переопределение индексатора, и он выдает ошибку "Невозможно установить атрибут IndexerName для переопределенного индексатора"

Как использовать IndexerName в абстрактных классах?

Спасибозаранее.

Ответы [ 2 ]

2 голосов
/ 10 августа 2011

Кажется, что компилятор проверяет именование перед применением наследования атрибутов.Из объявления IndexerNameAttribute мы можем видеть, что он может быть унаследован от производных классов.Это имеет больше смысла, если компилятор проверяет именование после того, как унаследованные атрибуты готовы, поскольку атрибуты, вероятно, могут влиять на имена.Может быть, есть некоторые причины, по которым команда компиляторов решает сначала проверить именование, я не знаю.Это не ваша ошибка, но я думаю, что для решения проблемы вам нужно изменить имя свойства Item (даже я знаю, что вы пытаетесь этого не делать).

[AttributeUsage(AttributeTargets.Property, Inherited = true)]
public sealed class IndexerNameAttribute : Attribute

Другое альтернативное решение - использование реальных методов.вместо индексаторов.

//base abstract class
public abstract string GetItem(string propertyName);
//and implement it in the derived classes
2 голосов
/ 10 августа 2011

Эта проблема будет исправлена, если вы просто переименуете Item во что-то другое, также рассмотрите возможность проверки этой связанной проблемы на IndexerName в здесь и здесь .

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