use*_*378 5 c# generics downcast
鉴于以下代码:
class Animal
{ }
class Dog : Animal
{ }
class Cage<T>
{
private T animal;
public Cage(T animal)
{
this.animal = animal;
}
public T Animal
{
get { return animal;}
}
}
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Cage<Animal> animalCage = new Cage<Animal>(dog);
Cage<Dog> dogCage = (Cage<Dog>)animalCage;
}
}
Run Code Online (Sandbox Code Playgroud)
如何解决最后一个编译器错误(从animalCage转换为dogCage)?
在我的代码中我知道笼子里有一只狗,但是我找不到一种方法来施放它.我是创建转换器并从Cage <Animal>的值创建新的Cage <Dog>实例的唯一替代方法吗?
您可以添加通用约束
class Cage<T> where T : Animal
Run Code Online (Sandbox Code Playgroud)
然后从你的方法返回基类
public Animal Animal
{
get { return animal;}
}
Run Code Online (Sandbox Code Playgroud)
泛型约束通知编译器可以为T提供的类型存在限制。如果您提供其他内容,例如Cage<object>,您将收到编译时错误。