如何强迫对仿制品进行贬低

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>实例的唯一替代方法吗?

Eri*_* J. 0

您可以添加通用约束

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>,您将收到编译时错误。