Универсальная коллекция общих предметов в классе? - PullRequest
3 голосов
/ 23 июня 2011

Я пытаюсь создать класс, который принимает два универсальных типа (IQueue, IItem), например:

public class Coordinator<T,K>
    where T : IQueue<K>
    where K : IItem
{
    private T<K> collection = new T<K>();
}

Где:

public interface IQueue<T> where T : IItem
{
}

public class MyQueue<T> : IQueue<T>
    where T : IItem
{
}

Но компилятор не любит:

private T<K> collection = new T<K>();

Это вообще возможно?

Спасибо!

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

Я думаю, вам нужно сделать следующее:

public interface IQueue<T> where T : IItem
{
}

public class MyQueue<T> : IQueue<T>
    where T : IItem
{
}

Потому что вы говорите: координатор получает IQueue, но вы пытаетесь создать MyQueue с более конкретной информацией.

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

class Coordinator <T,K>
    where T : IQueue<K>
    where K : IItem
{
    private T collection = (T)Activator.CreateInstance(typeof(T));
}
0 голосов
/ 23 июня 2011

Я думаю, вы могли ожидать, что в «где T: IQueue, где K: IItem» была последовательность, однако на самом деле она должна быть определена просто как сейчас . Было бы неплохо, если бы это сработало в будущем. Интуитивно то, что вы спрашиваете, имеет смысл для меня.

вот предложенный способ приблизиться к нему.

public class Coordinator<T> where T : IQueue<T>, new()
{
    private T collection = new T();  
}
public interface IQueue<T>{}
public interface IItem{}
...