gpt4 book ai didi

c# - 如何强制对泛型进行 downcast

转载 作者:太空狗 更新时间:2023-10-29 23:09:07 24 4
gpt4 key购买 nike

给定以下代码:

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;
}
}

如何解决最后一个编译器错误(从 animalCage 到 dogCage 的转换)?

在我的代码中我知道笼子里有一只狗,但我无法找到一种方法来转换它。创建转换器并根据 Cage 的值创建新的 Cage 实例是我唯一的选择吗?

最佳答案

问题#1:您无法打开 Cage<Animal>实例化为 Cage<Dog>例如,你需要一个 Cage<Dog>实例(或更具体类型的实例),其引用存储在不太具体类型的变量中。

改变

Cage<Animal> animalCage = new Cage<Animal>(dog);
Cage<Dog> dogCage = (Cage<Dog>)animalCage;

Cage<Animal> animalCage = new Cage<Dog>(dog);
Cage<Dog> dogCage = (Cage<Dog>)animalCage;

问题#2:您不能存储对 Cage<Dog> 的引用Cage<Animal> 中的实例变量,因为类不支持协变/逆变。

改变

class Cage<T>
{
...

interface ICage<out T> 
{
T Animal { get; }
}

class Cage<T> : ICage<T>
{

Cage<Animal> animalCage = new Cage<Dog>(dog);
Cage<Dog> dogCage = (Cage<Dog>)animalCage;

ICage<Animal> animalCage = new Cage<Dog>(dog);
ICage<Dog> dogCage = (Cage<Dog>)animalCage;

然后就可以了。 (如果您不将 new Cage<Animal> 更改为 new Cage<Dog> ,您会在运行时遇到强制转换异常。)

关于c# - 如何强制对泛型进行 downcast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13095461/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com