gpt4 book ai didi

C# 将派生泛型类型转换为父类

转载 作者:行者123 更新时间:2023-11-30 14:52:00 24 4
gpt4 key购买 nike

在我问问题之前,这是我的结构:

public class Data : ScriptableObject {...}
public class ItemData : Data {...}
public class WeaponData : ItemData {...}

public abstract class Item<T> : Visual<T> where T : ItemData {...}
public class Weapon<T> : Item<T> where T : WeaponData {...}

创建 Weapon 时出现错误(无法从源类型转换为目标类型)对象并将其分配给 Item<ItemData> .

Weapon<Foo> weapon = new Weapon<Foo>();
Item<ItemData> other = weapon;

这是为什么?

最佳答案

在 C# 中,协变(将派生类型分配给基类型)不能应用于泛型类。因此,您需要应用一个专门标记为协变的接口(interface),使用 out parameter modifier在一个新的IItem界面。

但是,这本身还不够。你没有办法告诉Item它将允许 Weapon 的实例在 Weapon 时分配给它有一个泛型类型参数,可以是任何,前提是它继承自 ItemData .这使编译器陷入困境,因为它无法向您保证这种关系是有效的。但是,如果您应用新的 IItemData ItemData 的接口(interface), 强制转换是允许的。

void Main()
{
Weapon<Foo> weapon = new Weapon<Foo>();
IItem<ItemData> other = weapon;
}

public interface IItem<out T> {}
public interface IItemData {}

public class Foo : WeaponData {}

public class Data : ScriptableObject {}
public class ItemData : Data, IItemData {}
public class WeaponData : ItemData {}

public abstract class Item<T> : Visual<T>, IItem<T> where T : IItemData {}
public class Weapon<T> : Item<T> where T : WeaponData {}

public class ScriptableObject {}
public class Visual<T> {}

这需要 Item<T>更新为限制为 IItemData而不是局限于具体类型。

关于C# 将派生泛型类型转换为父类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32928758/

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