首页 > 解决方案 > 传递具有从所需类型派生的类型的泛型对象

问题描述

是否可以使用派生自预期类类型的类类型将泛型对象作为参数传递?

下面的代码导致编译器错误,cannot convert from ItemObject<Equipment> to ItemObject<Item>我觉得很奇怪,因为Equipment继承自Item.

using System.Collections.Generic;

public abstract class Item { }

public abstract class Equipment : Item { }

public class ItemObject<T> where T : Item { }

public class EquipmentManager
{
    ItemObject<Equipment> equipment = new ItemObject<Equipment>();

    public void Unequip()
    {
        Inventory.instance.AddItem(equipment);
    }
}

public class Inventory
{
    public static Inventory instance;
    List<ItemObject<Item>> items = new List<ItemObject<Item>>();

    public void AddItem(ItemObject<Item> _item)
    {
        items.Add(_item);
    }

}

标签: c#genericsinheritancearguments

解决方案


您可以使用协方差来实现这一点,这将允许您使用更多派生的类型。但是,这只能应用于接口,因此您需要执行以下操作:

public abstract class Item { }

public abstract class Equipment : Item { }

public interface IItemObject<out T> where T : Item { }
public class ItemObject<T> : IItemObject<T> where T : Item { }

public class EquipmentManager {
    IItemObject<Equipment> equipment = new ItemObject<Equipment>();

    public void Unequip() {
        Inventory.instance.AddItem(equipment);
    }
}

public class Inventory {
    public static Inventory instance;
    List<IItemObject<Item>> items = new List<IItemObject<Item>>();

    public void AddItem(IItemObject<Item> _item) {
        items.Add(_item);
    }
}

更多关于协变和逆变的阅读。


推荐阅读