Generics Вопрос
Вопрос
У меня есть общий класс
public class Decoder<SIGNAL> where SIGNAL : signalType, new()
SignalType - это абстрактный класс. Как объявить динамическое поле для его хранения? Следующий код принесет ошибку компиляции, в которой говорится, что декодер должен быть универсальным типом.
public class DecoderParent
{
private Decoder<signalType> decoder;
public DecoderParent(keys key)
{
switch(key)
{
case keys.SignalOne:
{
decoder = new Decoder<signalONE>();
break;
}
case keys.signalTwo:
{
decoder = new Decoder<signalTWO>();
}
}
}
}
Решение
Есть 2 проблемы, с которыми вы сталкиваетесь здесь
- Тип SignalType нарушает общее ограничение на общем параметре SignalType. Поскольку это абстрактно, он не может удовлетворить новое () ограничение
- Назначение между
Decoder<signalType>
и любой другой тип требует поддержки ковариации, которая недоступна в C# (только в интерфейсах, начиная с V4.0).
Что вам нужно сделать, так это определить негенерический базовый класс, который определяет его операции до общих подкладов.
public abstract class Decoder {
...
abstract void SomeOp();
}
public abstract class Decoder<SIGNALTYPE> where SIGNALTYPE : signalType,new() {
}
Decoder d = new Decoder<SignalOne>();
Другие советы
Общие типы не являются ковариатными типами ссылок - см. Мой ответ здесь. Анкет Вы не можете назначить декодерu003CsignalONE> к переменной декодера типаu003CsignalType>
Не связан с StackOverflow