1

我有一个通用类

public class Decoder<SIGNAL> where SIGNAL : signalType, new()

signalType 是一个抽象类。如何声明一个动态字段来存储它?以下代码将引发编译错误,说明 Decoder 必须是非抽象类型泛型。

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>();
                }
        }
    }
}
4

2 回答 2

4

您在这里遇到了 2 个问题

  1. 类型 signalType 违反了对 SIGNALTYPE 泛型参数的泛型约束。因为它是抽象的,所以不能满足 new() 约束
  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>();
于 2009-09-24T21:44:26.670 回答
1

泛型类型不像引用类型那样协变 - 请参阅我的答案。您不能将 Decoder<signalONE> 分配给 Decoder<signalType> 类型的变量

于 2009-09-24T21:42:16.527 回答