Nie można przekonwertować z typu ogólnego na interfejs

Podczas próby dodania obiektu ogólnego do listy <> pojawia się błąd.

Prawdopodobnie jest to związane z kowariancją i kontrawariancją, ale nie wiem, jak to obejść. Próbowałem ograniczyć moje typy ogólne za pomocągdzie T: IRegister.

Mam interfejs do reprezentowania rejestru, a następnie dwie klasy, które reprezentują ByteRegister i DoubleWordRegister.

<code>public interface IRegister
{
    string Name {get;set;}
}

 public class ByteRegister : IRegister
{
...
}

public class DoubleWordRegister : IRegister
{
...
}
</code>

Następnie mam inną klasę, która reprezentuje blok tych rejestrów tego samego typu.

<code>public class RegisterBlock<T> where T:IRegister
{
   private IList<T> _registers;

 ... constructors, properties etc

    public void AddRegister(T register)
    {
        _registers.Add(register);
    }
}
</code>

I wreszcie mam klasę RegisterMap, która służy do definiowania listy bloków rejestrów i każdego rejestru w bloku.

<code>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);
    }
}
</code>

Jednak otrzymuję następujący błąd:

Error 20 Argument '1': cannot convert from 'RegisterBlock<ByteRegister>' to 'RegisterBlock<IRegister>' na linii _blocks.Add (block1) i podobnie na _blocks.Add (block2);

questionAnswers(4)

yourAnswerToTheQuestion