Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# T to Object起作用,但Listto List根本不起作用_C#_Unity3d - Fatal编程技术网

C# T to Object起作用,但Listto List根本不起作用

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

您好,下面是代码。我知道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
{
    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();