Кажется, что компилятор проверяет именование перед применением наследования атрибутов.Из объявления 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