2012-07-19 133 views
0

我有一個如下結構。我在返回泛型集合時遇到了一些麻煩。我錯過了什麼?在c中鑄造泛型類型#

class Program 
{ 
    static void Main() 
    { 
      BusinessCollection businessCollection = new BusinessCollection(); 

      //Why this is not working because businesscollection is a GenericCollection<BusinessEntity> 
      businessCollection = new GenericCollection<BusinessEntity>(); 

      //or neither this 
     businessCollection = (BusinessCollection)new GenericCollection<BusinessEntity>(); 
    } 
} 



public class BusinessEntity 
{ 
    public string Foo { get; set;} 
} 

public class BusinessCollection : GenericCollection<BusinessEntity> 
{ 
    //some implementation here 
} 

public class GenericCollection<T> : ICollection<T> 
{ 
    //some implementation here 
} 

回答

5

你不能做你想做的事情。另一種方式將工作。

所有BusinessCollection確實GenericCollection<BusinessEntity>但你不能肯定地說,所有GenericCollection<BusinessEntity>BusinessCollection

所以下面的工作。

class Program 
{ 
    static void Main() 
    { 
      GenericCollection<BusinessEntity> businessCollection = new BusinessCollection(); 
      //this will work 
      BusinessCollection tempCollection = (BusinessCollection)businessCollection ; 
    } 
} 



public class BusinessEntity 
{ 
    public string Foo { get; set;} 
} 

public class BusinessCollection : GenericCollection<BusinessEntity> 
{ 
    //some implementation here 
} 

public class GenericCollection<T> : ICollection<T> 
{ 
    //some implementation here 
} 
2

檢查你的假設:

businesscollection is a GenericCollection<BusinessEntity>

是的,但是你宣佈它作爲Businesscollection類型。並不是所有的GenericCollection<BusinessEntity>都是BusinessCollection,但這就是你想要分配給BusinessCollection

2

由於正方形是矩形,但並非所有矩形都是正方形。在這種情況下,BusinessCollectionGenericCollection<BusinessEntity>,但不是所有的GenericCollection<BusinessEntity>對象都是BusinessCollection對象。鍵入爲BusinessCollection的變量可以指向一個GenericCollection<BusinessEntity>對象,但不能反過來。

2

businessCollections鍵入爲BusinessCollection;它可以只有被分配的東西 a BusinessCollection。但是,GenericCollection<BusinessEntity>()不是 a BusinessCollection。就像「一隻動物」不是「一隻狗」(但「一隻狗」是「一隻動物」)一樣。

這可以在運行時或編譯時進行驗證。運行時,選擇是你的施法:

businessCollection = (BusinessCollection){some expression}; 

這是使用「動物」 可能是「狗」測試,即檢查,看看我們實際上是在考慮特定的動物是否是狗。它將這個檢查推遲到運行時間。這就是爲什麼這行編譯,但實際上並沒有運行。特定的動物從來沒有實際上是一隻狗。