无法从泛型类型转换接口 [英] Cannot convert from generic type to interface

查看:214
本文介绍了无法从泛型类型转换接口的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

>



其可能与协变和逆变,但我不知道如何工作的;

我试图仿制对象添加到列表<时,得到一个错误解决这个问题。我试着使用来限制我的泛型类型的其中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< D​​oubleWordRegister>块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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆