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