在c中铸造泛型类型#

问题描述:

我有一个如下结构。我在返回泛型集合时遇到了一些麻烦。我错过了什么?在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 
} 

你不能做你想做的事情。另一种方式将工作。

所有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 
} 

检查你的假设:

businesscollection is a GenericCollection<BusinessEntity>

是的,但是你宣布它作为Businesscollection类型。并不是所有的GenericCollection<BusinessEntity>都是BusinessCollection,但这就是你想要分配给BusinessCollection

由于正方形是矩形,但并非所有矩形都是正方形。在这种情况下,BusinessCollectionGenericCollection<BusinessEntity>,但不是所有的GenericCollection<BusinessEntity>对象都是BusinessCollection对象。键入为BusinessCollection的变量可以指向一个GenericCollection<BusinessEntity>对象,但不能反过来。

businessCollections键入为BusinessCollection;它可以只有被分配的东西 a BusinessCollection。但是,GenericCollection<BusinessEntity>()不是 a BusinessCollection。就像“一只动物”不是“一只狗”(但“一只狗”是“一只动物”)一样。

这可以在运行时或编译时进行验证。运行时,选择是你的施法:

businessCollection = (BusinessCollection){some expression}; 

这是使用“动物” 可能是“狗”测试,即检查,看看我们实际上是在考虑特定的动物是否是狗。它将这个检查推迟到运行时间。这就是为什么这行编译,但实际上并没有运行。特定的动物从来没有实际上是一只狗。