Общий тип в общей коллекции

2

У меня есть общий тип, который выглядит так:

public class GenericClass<T, U> where T : IComparable<T>
{
    // Class definition here
}

Затем у меня есть коллекция этих экземпляров. Каков самый чистый способ преодоления ограничений типа?

public class GenericCollection<V> where V : GenericClass<T, U> // This won't compile
{
    private GenericClass<T, U>[] entries;

    public V this[index]
    {
        get{ return this.entries[index]; }
    }
}

Возможно, лучший способ разработать это? Я думаю, что указание

GenericCollection<T, U, V> where V : GenericClass<T, U> 

кажется неудобным. Мог бы быть моим единственным вариантом, хотя....

Теги:
generics

5 ответов

6
Лучший ответ

При создании универсального класса все параметры типового типа всех объектов, используемых во всех членах родового класса, должны быть разрешимы во время компиляции.

У вас могут быть параметры типа, которые являются конкретными экземплярами других общих типов - например:

public class GenericCollection<T> where T : GenericClass<int, string> { ... }

Но если вы хотите, чтобы параметры типа GenericClass были сами по себе, все эти типы должны быть частью объявления класса, как вы написали:

GenericCollection<T, U, V> where V : GenericClass<T, U> 

Извините, если это кажется неудобным, но это ваш единственный вариант.

  • 3
    Стоит отметить, что в объявленном поле private GenericClass<T, U>[] entries , вероятно, должны быть записаны как private V[] entries . Я не думаю, что код скомпилируется иначе, свойство indexer не будет действительным без приведения.
  • 0
    Ты прав. Спасибо что подметил это.
2

Я думаю, что коллекции потребуются те же ограничения, что и GenericClass:

public class GenericCollection<T, U> where T : IComparable<T>
{
    private GenericClass<T, U>[] entries;
}
  • 0
    Сначала я попробовал это сделать, но хотел иметь индексатор, безопасный для типов. Я обновил вопрос, чтобы отразить это.
  • 1
    @Brian Почему вы не можете иметь публичный GenericClass <T, U> this [int index]? Как это небезопасно?
Показать ещё 1 комментарий
1

Я думаю, что это то, что вы действительно хотите.

    class g<t, u> where t : IComparable<t>
{
}

class gc<t, u>
{
    private g<t, u>[] entries;

    public g<t, u> this[int index]
    {
        get { return this.entries[index]; }
    }
}
1

Я думаю, что ваше решение

public class GenericClass<T, U> where T : IComparable<T>
{
     // Class definition here
}

public class GenericCollection<T,U>  where T : IComparable<T>
{
     private GenericClass<T, U>[] entries;
     public GenericClass<T, U> this[int index]
      {
         get{ return this.entries[index]; }
      }
}
0

вы не объявили его как класс!

public class GenericCollection<V>
  • 1
    хаха, хороший улов. обновил редактирование. Это была не моя проблема, хотя ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню