【问题标题】:Can't seem to cast from interface to my struct for a list似乎无法从接口转换到我的结构以获取列表
【发布时间】:2020-08-28 04:32:22
【问题描述】:

我有一个函数,它返回一个名为IPathfindingNode 的接口列表。

我创建了一个实现接口的结构:

public struct Node : IPathfindingNode
{
    public int X { get; }
    public int Y { get; }
}

我调用了一个返回接口列表的函数:

public List<IPathfindingNode> FindPath(Vector2Int startPoint, Vector2Int targetPoint)

当我尝试分配结果时,我收到一条错误消息,说我无法将它分配到我的列表中,但我不明白为什么。

List<Node> path = Map.FindPath(startPoint, targetPoint);

我收到此错误:

不能隐式转换类型 'System.Collections.Generic.List' 到'System.Collections.Generic.List'

如何正确投射?我尝试了as List&lt;Node&gt;();,但仍然无法正确转换。

【问题讨论】:

  • 为什么选择将Node 设为结构?当您将它添加到列表中时,它可以存储接口引用的唯一方法是将它装箱,这就是发生的情况。如果您试图避免分配,请知道它们无论如何都会发生。
  • 课程不是也装箱了吗?我试图将它写在支持类或结构的地方,因为我试图写给任何人使用,人们可能出于任何原因使用结构或类。
  • 装箱是一个值类型特性。它将 值类型 装箱(包装)在 object 中,并将其放在堆上。
  • 类总是分配在托管堆上,所以不需要装箱。装箱为托管堆上的值类型分配空间并将其复制到该内存。只要您知道结构在以这种方式使用时会被装箱并且不期望其他东西,那么您正在做的事情就很好。
  • 有没有办法写它来禁止结构然后用于我的界面?

标签: c#


【解决方案1】:

不管其他问题,你可以直接使用Cast

将 IEnumerable 的元素转换为指定类型。

List<Node> path = Map.FindPath(startPoint, targetPoint)
                     .Cast<Node>()
                     .ToList()

如果FindPath 返回Node 的其他非Node 实现,您可以使用OfType

根据指定类型过滤 IEnumerable 的元素。

【讨论】:

  • 这段代码在幕后做什么?我假设为每个元素创建一个新列表并使用新类型进行复制?
  • @WDUK 是的,它确实在这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多