2015-11-04 87 views
0

我正在一個項目上工作,我有一個關於轉換類型的問題。類型參數和錯誤的約束「不能隱式轉換類型」

問題:

無法隱式轉換類型 '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

您無法將派生類轉換爲其基類,但您可以將其轉換爲 – 2015-11-04 04:08:30

+0

爲什麼我無法將派生類轉換爲基類? –

+0

爲什麼你在這裏有這麼多的抽象層?由於抽象基類沒有真正提供任何基本功能,你只是混淆了類型系統。如果你的實際實現遵循你的例子,我會拋棄抽象類,讓具體的實現直接實現接口。 –

回答

1

編譯器報告錯誤,因爲Storage<Item>不是基類StorageImp。而不是Storage<ItemImp>StorageImp的基類。

所以更換

Storage<Item> storage = new StorageImp(); 

Storage<ItemImp> storage = new StorageImp(); 

更新

如果你想從類 「ItemImp」 的實現抽象的評價,那麼你需要做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(); 
    } 
} 
+0

它的工作原理,但我需要從類「ItemImp」的實現抽象。它可能是別的嗎? –

+0

@AntonGorinenko然後,您需要使'StorageImp'類型也具有通用的約束,即通用類型需要爲'Item' –

+0

StorageImp類應該與基類Item的特定實現一起工作。例如,ItemImp ... –