リストに汎用オブジェクトを追加しようとするとエラーが発生します。<>汎用タイプからインタフェースに変換できません
おそらく共分散とコントラバリャンスに関連していますが、これを回避する方法がわかりません。私はを使ってジェネリックタイプを制限しようとしましたが、ここでT:IRegister。
私は、レジスタを表すためのインターフェースを持っています。次に、ByteRegisterとDoubleWordRegisterを表す2つのクラスを持っています。
public interface IRegister
{
string Name {get;set;}
}
public class ByteRegister : IRegister
{
...
}
public class DoubleWordRegister : IRegister
{
...
}
次に、同じタイプのすべてのこれらのレジスタのブロックを表す別のクラスがあります。
public class RegisterBlock<T> where T:IRegister
{
private IList<T> _registers;
... constructors, properties etc
public void AddRegister(T register)
{
_registers.Add(register);
}
}
最後に、レジスタブロックとブロック内の各レジスタのリストを定義するために使用されるRegisterMapクラスがあります。私は次のエラー取得していますが
public class RegisterMap
{
private List<RegisterBlock<IRegister>> _blocks;
public RegisterMap()
{
_blocks = new List<RegisterBlock<IRegister>>();
RegisterBlock<ByteRegister> block1= new RegisterBlock<ByteRegister>("Block1", 0);
block1.AddRegister(new ByteRegister("Reg1"));
block1.AddRegister(new ByteRegister("Reg2"));
_blocks.Add(block1);
RegisterBlock<DoubleWordRegister> block2= new RegisterBlock<DoubleWordRegister>("Block2", 10);
block2.AddRegister(new DoubleWordRegister("Reg3"));
block2.AddRegister(new DoubleWordRegister("Reg4"));
block2.AddRegister(new DoubleWordRegister("Reg5"));
_blocks.Add(block2);
}
}
:ライン上
Error 20 Argument '1': cannot convert from 'RegisterBlock<ByteRegister>' to 'RegisterBlock<IRegister>'
を_blocks.Add(ブロック1)と同様に_blocks.Add上(ブロック2)。
お困りですか?コンパイラのエラーはかなり明確です。 – phoog