[英]Casting a generic type in 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
; 它只能被分配为 BusinessCollection
。 但是, GenericCollection<BusinessEntity>()
不是 BusinessCollection
。 同样,“动物”不是“狗”(但“狗”是“动物”)。
这可以在运行时或编译时进行验证。 runtime-option是您的演员:
businessCollection = (BusinessCollection){some expression};
使用“动物” 可能是“狗”测试,即检查我们正在考虑的特定动物是否实际上是狗。 它将检查推迟到运行时。 这就是为什么该行可以编译但实际上没有运行的原因 。 特定的动物实际上从来不是狗。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.