Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中强制转换泛型类型_C#_.net_Generics_Generic Collections - Fatal编程技术网

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};
这是使用“动物可能是狗”测试,即检查我们正在考虑的特定动物是否真的是狗。它将此检查推迟到运行时。这就是为什么这行代码可以编译,但实际上没有运行。特定的动物从来不是真正的狗