此C#无法编译:
public class IdList<T> where T : IdList<T>.Item {
List<T> List = new List<T>();
public T this[int id] {
get => List[id];
set { }
}
public class Item {
public int id;
// Not shown: id used for equality and hash.
}
}
编译器的投诉是:
类型“ IdList”已经包含“商品”的定义
如果我注释掉索引器,它将编译。
如何获取此文件?骑士没有修复。
不时髦的解决方法是不嵌套Item类。
IDE是macOS上的Rider 2018.1.4,语言级别7.2。
答案 0 :(得分:6)
问题在于,索引器在编译为.NET字节代码时,将变成称为“ Item”的属性。您需要将类型名称更改为其他名称。
答案 1 :(得分:1)
解决方案:通过使用以下方法消除名称冲突:
System.Runtime.CompilerServices.IndexerName("TheItem")
public class IdList<T> where T : IdList<T>.Item {
List<T> List = new List<T>();
[System.Runtime.CompilerServices.IndexerName("TheItem")]
public T this[int id] {
get => List[id];
set { }
}
public class Item {
public int id;
// Not shown: id used for equality and hash.
}
}
编译器错误应该更明确,并说Item
已被定义为索引器的默认名称(可以覆盖),并且IDE应该提供此修复程序。