У меня есть общий тип, который выглядит так:
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>
кажется неудобным. Мог бы быть моим единственным вариантом, хотя....
При создании универсального класса все параметры типового типа всех объектов, используемых во всех членах родового класса, должны быть разрешимы во время компиляции.
У вас могут быть параметры типа, которые являются конкретными экземплярами других общих типов - например:
public class GenericCollection<T> where T : GenericClass<int, string> { ... }
Но если вы хотите, чтобы параметры типа GenericClass
были сами по себе, все эти типы должны быть частью объявления класса, как вы написали:
GenericCollection<T, U, V> where V : GenericClass<T, U>
Извините, если это кажется неудобным, но это ваш единственный вариант.
Я думаю, что коллекции потребуются те же ограничения, что и GenericClass:
public class GenericCollection<T, U> where T : IComparable<T>
{
private GenericClass<T, U>[] entries;
}
Я думаю, что это то, что вы действительно хотите.
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]; }
}
}
Я думаю, что ваше решение
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]; }
}
}
вы не объявили его как класс!
public class GenericCollection<V>
private GenericClass<T, U>[] entries
, вероятно, должны быть записаны какprivate V[] entries
. Я не думаю, что код скомпилируется иначе, свойство indexer не будет действительным без приведения.