我正在尝试使用我的抽象类上的IndexerName属性重命名我的索引器属性。但它仍显示编译错误“XXX”类型已包含“项目”的定义。
抽象类:
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”类型已包含“项目”的定义。
我尝试将IndexerName放在索引器覆盖上并显示错误“无法在标记为覆盖的索引器上设置IndexerName属性”
如何在抽象类上使用IndexerName?
提前致谢。
答案 0 :(得分:2)
答案 1 :(得分:2)
似乎编译器在应用属性继承之前检查命名。从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