C# 在c中强制转换泛型类型
我有一个如下的结构。我很难返回一个通用集合。我错过了什么C# 在c中强制转换泛型类型,c#,.net,generics,generic-collections,C#,.net,Generics,Generic Collections,我有一个如下的结构。我很难返回一个通用集合。我错过了什么 class Program { static void Main() { BusinessCollection businessCollection = new BusinessCollection(); //Why this is not working because businesscollection is a GenericCollection<BusinessEn
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是一个通用集合
是的,但您将其声明为Businesscollection类型。并非所有GenericCollection都是BusinessCollection,但这正是您试图分配给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实际上都是GenericCollection,但您不能确定所有GenericCollection都是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是GenericCollection,但并非所有GenericCollection对象都是BusinessCollection对象。类型为BusinessCollection的变量可以指向GenericCollection对象,但不能指向其他对象。businessCollections类型为BusinessCollection;只能为其分配属于BusinessCollection的内容。但是,GenericCollection不是BusinessCollection。就像动物不是狗而是狗一样 这可以在运行时或编译时进行验证。运行时选项是您的强制转换:
businessCollection = (BusinessCollection){some expression};
这是使用“动物可能是狗”测试,即检查我们正在考虑的特定动物是否真的是狗。它将此检查推迟到运行时。这就是为什么这行代码可以编译,但实际上没有运行。特定的动物从来不是真正的狗