C# T to Object起作用,但Listto List根本不起作用
您好,下面是代码。我知道T将始终是基类项的类型。 但我无法将列表转换为项目。对于T项目,它的工作C# T to Object起作用,但Listto List根本不起作用,c#,unity3d,C#,Unity3d,您好,下面是代码。我知道T将始终是基类项的类型。 但我无法将列表转换为项目。对于T项目,它的工作 private List<Item> activeItemList; private Item activeItem; public void StartBuildingSystem<T>(List<T> itemList, T item, int count, string name) where T : Item { UiPlacementActi
private List<Item> activeItemList;
private Item activeItem;
public void StartBuildingSystem<T>(List<T> itemList, T item, int count, string name) where T : Item
{
UiPlacementActivate(itemList, item,count);
PlacingAreas(GetActiveBluePrint(name), GetActiveType(itemList, name));
activeBuildingType = GetActiveBuildingType(name);
activeItem = item;
//activeItemList = itemList;//
}
///中的代码不起作用,因为我无法将列表T强制转换为列表项。还有更好的办法吗?如果我知道传入列表将始终来自基类项,但它来自不同的InventorySooling、Secruity等,。。。。或者,有没有一种方法可以将列表转换为易于项目列表,就像它适用于T项到项一样。由于列表是不变的,所以不能在各种类型的列表之间转换。有关更多信息,请参阅或查看 您可以通过一次转换一个列表项来转换列表,而不是强制转换。所以不是
activeItemList = itemList;
使用
如果您可以在代码中进行以下更改,它将允许协方差:
private IEnumerable<Item> activeItemList; // previously List<Item>
private Item activeItem;
public void StartBuildingSystem<T>(List<T> itemList, T item, int count, string name) where T : Item
{
UiPlacementActivate(itemList, item,count);
PlacingAreas(GetActiveBluePrint(name), GetActiveType(itemList, name));
activeBuildingType = GetActiveBuildingType(name);
activeItem = item;
activeItemList = itemList; //it will now work
}
可变集合无法实现差异。要了解原因,请参阅以下基于代码的示例:
private List<Fruit> currentFruitList;
private Fruit currentFruit;
public void StartBuildingSystem<T>(List<T> fruitList, T fruit) where T : Fruit
{
currentFruit = fruit;
currentFruitList = fruitList;
}
让我们暂时想象一下,上面的代码编译后不会出现这种情况。现在想象你这样做:
List<Apple> apples = new();
Apple apple = new();
StartBuildingSystem(apples, apple);
Orange orange = new();
currentFruit = orange; //fine!
currentFruitList.Add(new Orange()); //this is a problem!
但是,不可变集合可以处理此问题。为了扩展此示例,如果您将列表更改为IEnumerable,则一切都将正常编译,因为您不能意外地将橙色添加到IEnumerable中,这是Microsoft在这方面提供的更好的文章之一。John的回答看起来会起作用,但这是另一种选择:
// add "using System.Linq;" beforehand
activeItemList = itemList.Cast<Item>().ToList();
其他答案也解释了这一点,但基本上,activeItemList不能分配给严格子类型的列表,例如Item的BlueItem,因为这样,该列表将受到更大的限制,并且无法处理其他非重叠子类型的项,例如RedItem。您能发布您得到的确切错误吗?如果不知道您使用的所有方法的确切特征,就很难看到它。。。一般来说,你可以在C-tons的SO文章和其他关于它的文章中使用查找协方差
// add "using System.Linq;" beforehand
activeItemList = itemList.Cast<Item>().ToList();