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

ジェネリック型は、参照型のように共変ではありません。私の回答hereを参照してください。Decoder<signalONE> を Decoder<signalType> 型の変数に割り当てることはできません

于 2009-09-24T21:42:16.527 に答える