Общий класс, параметр которого расширяет вложенный класс - PullRequest
0 голосов
/ 28 августа 2018

Этот 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'

Если я закомментирую индексатор, он компилируется.

Как я могу получить это для компиляции? У Райдера нет исправлений.

Нестандартный обходной путь - не вкладывать класс Item.

IDE - Rider 2018.1.4, уровень языка 7.2, в macOS.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Решение: устраните конфликт имен, используя, например, 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 должна предложить это исправление.

0 голосов
/ 28 августа 2018

Проблема заключается в том, что индексатор при компиляции в байтовый код .NET становится свойством с именем «Item». Вам нужно изменить имя типа на другое.

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