无法从泛型类型转换接口 [英] Cannot convert from generic type to interface
问题描述
其可能与协变和逆变,但我不知道如何工作的;
我试图仿制对象添加到列表<时,得到一个错误解决这个问题。我试着使用来限制我的泛型类型的其中T:IRegister 的
我要代表名册的接口,然后两个类其中。 。代表ByteRegister和DoubleWordRegister
公共接口IRegister
{
字符串名称{;设置; }
}
公共类ByteRegister:IRegister
{
:
}
公共类DoubleWordRegister:IRegister
{
:
}
然后我有另一个类。它代表了这些寄存器的块中的所有相同类型的
公共类RegisterBlock< T>其中T:IRegister
{
私人的IList< T> _registers;
...构造,性能等
公共无效AddRegister(T寄存器)
{
_registers.Add(注册);
}
}
最后我有一个用于将RegisterMap类定义寄存器块列表和块内的每个注册。
公共类RegisterMap
{
私人清单< RegisterBlock< IRegister>> _blocks;
公共RegisterMap()
{
_blocks =新的List< RegisterBlock< IRegister>>();
RegisterBlock< ByteRegister>块1 =新RegisterBlock&所述; ByteRegister>(块1,0);
block1.AddRegister(新ByteRegister(REG1));
block1.AddRegister(新ByteRegister(REG2));
_blocks.Add(块1);
RegisterBlock< DoubleWordRegister>块2 =新RegisterBlock&所述; DoubleWordRegister>(块2,10);
block2.AddRegister(新DoubleWordRegister(REG3));
block2.AddRegister(新DoubleWordRegister(REG4));
block2.AddRegister(新DoubleWordRegister(REG5));
_blocks.Add(块2);
}
}
但是我收到以下错误
错误20参数1:不能从转换'RegisterBlock< ByteRegister>'到'RegisterBlock< IRegister>
上线_blocks.Add(块1)同样对_blocks.Add(块2);
这的确是一个的 **方差问题。你需要为你的 RegisterBlock
类,也许 IRegisterBlock
其它接口:
公共类RegisterBlock< T> :IRegisterBlock
,其中T:IRegister
然后您可以创建<$ C $名单C> IRegisterBlock :
私人列表< IRegisterBlock> _blocks;
其实我上周曾在我们的代码库类似的情况,而这正是我该怎么解决吧。
I'm getting an error when trying to add generic object to a List<>.
Its probably related to Covariance and Contravariance but I not sure how to work around this. I've tried to restrict my generic types using where T: IRegister.
I have an interface to represent a register and then two classes which represent a ByteRegister and a DoubleWordRegister.
public interface IRegister
{
string Name {get;set;}
}
public class ByteRegister : IRegister
{
...
}
public class DoubleWordRegister : IRegister
{
...
}
I then have another class which represents a block of these registers all of the same type.
public class RegisterBlock<T> where T:IRegister
{
private IList<T> _registers;
... constructors, properties etc
public void AddRegister(T register)
{
_registers.Add(register);
}
}
And finally I have a RegisterMap class which is used to define the list of register blocks and each register within the block.
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);
}
}
However I'm getting the following error:
Error 20 Argument '1': cannot convert from 'RegisterBlock<ByteRegister>' to 'RegisterBlock<IRegister>'
on the line _blocks.Add(block1) and similarly on _blocks.Add(block2);
This is indeed a **variance problem. You will need another interface for your RegisterBlock
class, maybe IRegisterBlock
:
public class RegisterBlock<T> : IRegisterBlock
where T : IRegister
Then you can create a list of IRegisterBlock
:
private List<IRegisterBlock> _blocks;
I actually had a similar situation in our code-base last week, and this is exactly how I resolved it.
这篇关于无法从泛型类型转换接口的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!