Вопрос

У меня есть общий класс

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 проблемы, с которыми вы сталкиваетесь здесь

  1. Тип SignalType нарушает общее ограничение на общем параметре SignalType. Поскольку это абстрактно, он не может удовлетворить новое () ограничение
  2. Назначение между 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>

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top