gpt4 book ai didi

c# - 向下转换通用元素类型

转载 作者:太空狗 更新时间:2023-10-29 19:49:43 25 4
gpt4 key购买 nike

public class ConfigControlBase<T> : UserControl
where T : ProviderBase
{
public T Provider { get; set; }

public void Init(T provider)
{
this.Provider = provider;
}
}


public abstract class ProviderBase
{
public abstract ConfigControlBase<ProviderBase> GetControl();
}

public class ProviderXConfigControl : ConfigControlBase<ProviderX>
{
}

public class ProviderX : ProviderBase
{
public override ConfigControlBase<ProviderBase> GetControl()
{
var confControl = new ProviderXConfigControl() as ConfigControlBase<ProviderX>;
return confControl;
}
}

return confControl;抛出异常:

Cannot implicitly convert type ConfigControlBase<ProviderX> to ConfigControlBase<ProviderBase>

最佳答案

让我们更改类和属性的名称,但保持形状不变:

public class Cage<T> where T : Animal
{
public T Contents { get; set; }
}

public class Aquarium : Cage<Fish> { }

public abstract class Animal
{
public abstract Cage<Animal> GetCage();
}

public class Fish : Animal
{
public override Cage<Animal> GetCage()
{
return (Cage<Animal>)(new Aquarium());
}
}

现在清楚为什么这是不合法的了吗?假设这是合法的。然后你可以这样做:

Fish fish = new Fish();
Cage<Animal> cage = fish.GetCage();
cage.contents = new Tiger();

现在您的水族馆里有一只老虎。没有人想要那样。

编译器(或运行时)必须以某种方式防止这种类型错误;它选择尽快阻止它。它最早可以这样做是在从 Aquarium 转换为 Cage<Animal> 的型式测试中。 .编译器知道这最终会导致水族馆里的老虎,所以它根本不允许转换。如果您强制编译器允许它通过强制转换,那么它会在运行时失败。

关于c# - 向下转换通用元素类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4923936/

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