Konvertierung von generischem Typ zu Schnittstelle nicht möglich

Beim Versuch, ein generisches Objekt zu einer Liste <> hinzuzufügen, wird eine Fehlermeldung angezeigt.

Es hängt wahrscheinlich mit Covarianz und Contravarianz zusammen, aber ich weiß nicht, wie ich das umgehen soll. Ich habe versucht, meine generischen Typen mit einzuschränkenWobei T: IRegister.

Ich habe eine Schnittstelle, um ein Register und dann zwei Klassen darzustellen, die ein ByteRegister und ein DoubleWordRegister darstellen.

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

 public class ByteRegister : IRegister
{
...
}

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

Ich habe dann eine andere Klasse, die einen Block dieser Register vom gleichen Typ darstellt.

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

 ... constructors, properties etc

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

Und schließlich habe ich eine RegisterMap-Klasse, mit der die Liste der Registerblöcke und jedes Register innerhalb des Blocks definiert wird.

<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>

Ich erhalte jedoch den folgenden Fehler:

Error 20 Argument '1': cannot convert from 'RegisterBlock<ByteRegister>' to 'RegisterBlock<IRegister>' in der Zeile _blocks.Add (Block1) und in ähnlicher Weise in _blocks.Add (Block2);

Antworten auf die Frage(4)

Ihre Antwort auf die Frage