繁体   English   中英

在C#中强制转换泛型

[英]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

因为正方形是矩形,但并非所有矩形都是正方形。 在这种情况下, BusinessCollectionGenericCollection<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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM