在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
。
由于正方形是矩形,但并非所有矩形都是正方形。在这种情况下,BusinessCollection
是GenericCollection<BusinessEntity>
,但不是所有的GenericCollection<BusinessEntity>
对象都是BusinessCollection
对象。键入为BusinessCollection
的变量可以指向一个GenericCollection<BusinessEntity>
对象,但不能反过来。
businessCollections
键入为BusinessCollection
;它可以只有被分配的东西是 a BusinessCollection
。但是,GenericCollection<BusinessEntity>()
不是 a BusinessCollection
。就像“一只动物”不是“一只狗”(但“一只狗”是“一只动物”)一样。
这可以在运行时或编译时进行验证。运行时,选择是你的施法:
businessCollection = (BusinessCollection){some expression};
这是使用“动物” 可能是“狗”测试,即检查,看看我们实际上是在考虑特定的动物是否是狗。它将这个检查推迟到运行时间。这就是为什么这行编译,但实际上并没有运行。特定的动物从来没有实际上是一只狗。