Tôi gặp lỗi khi cố thêm đối tượng chung vào Danh sách <>.Không thể chuyển đổi từ loại chung sang giao diện
Nó có thể liên quan đến hiệp phương sai và contravariance nhưng tôi không chắc chắn làm thế nào để làm việc xung quanh này. Tôi đã cố gắng hạn chế các loại chung của mình bằng cách sử dụng trong đó T: IRegister.
Tôi có một giao diện đại diện cho một thanh ghi và sau đó hai lớp đại diện cho một ByteRegister và một DoubleWordRegister.
public interface IRegister
{
string Name {get;set;}
}
public class ByteRegister : IRegister
{
...
}
public class DoubleWordRegister : IRegister
{
...
}
Sau đó tôi có một lớp khác đại diện cho một khối của các thanh ghi này cùng loại.
public class RegisterBlock<T> where T:IRegister
{
private IList<T> _registers;
... constructors, properties etc
public void AddRegister(T register)
{
_registers.Add(register);
}
}
Và cuối cùng tôi có một lớp RegisterMap được sử dụng để xác định danh sách khối đăng ký và mỗi đăng ký trong khối.
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);
}
}
Tuy nhiên tôi nhận được lỗi sau:
Error 20 Argument '1': cannot convert from 'RegisterBlock<ByteRegister>' to 'RegisterBlock<IRegister>'
trên dòng _blocks.Add (block1) và tương tự trên _blocks.Add (block2);
Câu hỏi của bạn là gì? Lỗi trình biên dịch khá rõ ràng. – phoog