c# - 传递具有从所需类型派生的类型的泛型对象
问题描述
是否可以使用派生自预期类类型的类类型将泛型对象作为参数传递?
下面的代码导致编译器错误,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);
}
}
解决方案
您可以使用协方差来实现这一点,这将允许您使用更多派生的类型。但是,这只能应用于接口,因此您需要执行以下操作:
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);
}
}
更多关于协变和逆变的阅读。
推荐阅读
- mysql - 在 MySQL 表上正确使用连接
- mesos - Apache Chronos 架构说明
- php - PHP读取响应Json
- php - 如何处理损坏的图像图标?
- spring-boot - 访问 http://localhost:8181/oauth/token 时出现错误 401
- arrays - didSelectRowAt 更改所有行中的值
- ios - Cordova IOS webview 界面随机无响应
- javascript - 如何将一组独特的对象组合成一个对象?
- reactjs - 无法在 React-Redux 组件的 Jest/Enzyme 测试中获取节点
- jsp - 来自 jsp 的 Windows 10 Tomcat 日志记录