类型参数和错误的约束“不能隐式转换类型”

时间:2015-11-04 03:53:06

标签: c# inheritance constraints

我正在开展一个项目,我对转换类型有疑问。

问题:

  

无法将类型'ConsoleApplication2.Imp.StorageImp'隐式转换为   “ConsoleApplication2.Storage(ConsoleApplication2.Item)

我的简单代码:

public interface IItem
{
    void Add();
}

public abstract class Item : IItem
{
    public abstract void Add();
}

public class ItemImp : Item
{
    public override void Add()
    {
        throw new NotImplementedException();
    }
}

public interface IStorage<T> where T : Item
{
    List<T> Get(); 
    bool Add(T item);
}

public abstract class Storage<T> : IStorage<T> where T : Item
{
    public abstract bool Add(T item);
    public abstract List<T> Get();
}

public class StorageImp : Storage<ItemImp>
{
    public override bool Add(ItemImp item)
    {
        throw new NotImplementedException();
    }

    public override List<ItemImp> Get()
    {
        throw new NotImplementedException();
    }
}

转换的问题代码(我尝试将实现转换为基类):

class Program
{
    static void Main(string[] args)
    {
        Storage<Item> storage = new StorageImp();
    }
}

请帮帮我。

1 个答案:

答案 0 :(得分:1)

编译器报告错误,因为Storage<Item>不是StorageImp的基类。相反,Storage<ItemImp>StorageImp的基类。

所以替换

Storage<Item> storage = new StorageImp();

Storage<ItemImp> storage = new StorageImp();

<强>更新

如果你想从类的实现中抽象出来&#34; ItemImp&#34;如上所述,您需要使StorageImp具有通用性,如下所示:

class Program
{
    static void Main(string[] args)
    {
        Storage<Item> storage = new StorageImp<Item>();
    }
}



public interface IItem
{
    void Add();
}

public abstract class Item : IItem
{
    public abstract void Add();
}

public class ItemImp : Item
{
    public override void Add()
    {
        throw new NotImplementedException();
    }
}

public interface IStorage<T> where T : Item
{
    List<T> Get();
    bool Add(T item);
}

public abstract class Storage<T> : IStorage<T> where T : Item
{
    public abstract bool Add(T item);
    public abstract List<T> Get();
}

public class StorageImp<T> : Storage<T> where T: Item
{
    public override bool Add(T item)
    {
        throw new NotImplementedException();
    }

    public override List<T> Get()
    {
        throw new NotImplementedException();
    }
}