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