Создать собственную коллекцию пользователей

Мне нужно создать универсальную коллекцию универсальных коллекций, которая должна содержать универсальный класс. Я очень старался, но не нашел ответов. Вот как выглядит моя реализованная коллекция: https://github.com/Infatum/PMC-Data-Model/blob/master/WTF/Position.cs Это коллекция позиции универсального класса Point. Мне нужно создать индексированную коллекцию позиций с именем Matrix, индексированную коллекцию Matrix с именем Container и индексированную коллекцию контейнеров с именем Containers. Пожалуйста, помогите мне!

public class Matrix<T> : ICollection<T> where T : Position<T>
{
    protected ArrayList matrix;
    protected bool isReadOnly;

    public Matrix()
    {
        matrix = new ArrayList();
    }
// ...
}

Проблема: тип 'T' нельзя использовать в качестве параметра типа 'T' в универсальном типе или методе 'Position'. Не существует неявного преобразования ссылок из 'T' в 'WTF.Point'

Это на самом деле задача, которая была дана мне: https://docs.google.com/document/d/1ZYXXAjrh0OYNLUuFy0HT6ZuAzISIecE73cgA4QoRDlc/edit

1 ответ

Ваше ограничение типа на T является рекурсивным - я не думаю, что вы этого хотите. (И компилятор тоже: ограничение накладывает T быть своего рода Position<T>, это означает, что Position<T> на самом деле Position<Position<T>> - который нарушает ограничение вашего типа на общий аргумент Position, это ожидает WTF.Point вместо Position)

Решение:

public class Matrix<T> : ICollection<Position<T>>

Но позвольте мне уточнить это немного подробнее: в некотором смысле, вы хотите что-то вроде

public class Matrix<T> : ICollection<T> where T : Position<U>

так что больше нет рекурсии. Ты хочешь T быть "своего рода Position"Но теперь у нас появилась бы новая проблема: U (давайте назовем это "тип элемента") откуда? Вы должны использовать это в качестве аргумента универсального типа Matrix:

public class Matrix<U> : ICollection<T> where T : Position<U>

Теперь ограничение может быть свернуто непосредственно в тип интерфейса, т.е. ICollection<Position<U>> давая именно то решение, которое я дал выше (по модулю имен).

Другие вопросы по тегам