【发布时间】:2017-09-07 09:17:42
【问题描述】:
我有一个通用类Zone<T> where T: Media.Medium。在这个类中,我有一个方法public void AddNode(Node node),其中我有一个语句node.ParentZone = this,它会引发这个编译器错误:
无法将类型“Zone
”隐式转换为 '区域 '
但我不明白为什么public abstract class Node 有public Zone<Media.Medium> ParentZone 字段和Zone<T> where T: Media.Medium 类受where T: Media.Medium 约束,所以在任何情况下T 都是Media.Medium。
这里是孤立的代码:(完整的Zone<T>和Node的相关部分)
public class Zone<T> where T: Media.Medium
{
public readonly Type MediaType = typeof(T);
public readonly Guid ID = new Guid();
private readonly List<Node> _nodes = new List<Node>();
public void AddNode(Node node)
{
foreach (var port in node.GetPorts())
{
port.Medium = Activator.CreateInstance<T>();
}
//下面一行编译出错
node.ParentZone = this;
// 不能将类型 'Zone
' 隐式转换为 '区域 '
_nodes.Add(node);
}
public List<Node> GetNodes() => new List<Node>(_nodes);
public void RemoveNode(Node node) => _nodes.Remove(node);
}
public abstract class Node
{
public Zone<Media.Medium> ParentZone;
...
}
更新 #1:
这段代码的目标是:我想将Node 对象添加到Zone 对象,Zone 对象有一个Node 对象列表。每当我将Node 添加到Zone 时,我想将该Zone 对象设置为Node 对象的父对象。
我愿意进行任何重构以实现这一目标。如果有更好的方式,它不应该是这样的。
【问题讨论】:
-
您是否尝试使类节点也通用?公共抽象类 Node
where T : Media.Medium { public Zone ParentZone; } -
不,我没有。我要检查一下,谢谢。
-
好吧,将
Node更改为Node<T> where T: Media.Medium并在Zone<T>类中使用Node<T>而不是Node。但是重构后我得到了同样的编译错误。 -
这与泛型的类型约束无关;您不能将
Class<Derived>分配给Class<Base>有充分的理由 - 请参阅this StackOverflow 答案以获得一些见解。也就是说,为什么您的 Zone 类型是通用的?看起来您实际上并没有在任何地方使用 T 类型参数。 -
谢谢你,去看看那个帖子。
Zone是通用的,因为我想确保(现在或以后)Zone中的每个Node都具有相同类型的 Medium,即Zone<T>中的 T。 @FilipMilovanović