泛型类,其参数扩展了嵌套类

时间:2018-08-28 15:33:24

标签: c# inner-classes c#-7.2

此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。

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应该提供此修复程序。