C#带泛型约束的Heap<T>无法使用NodeInt类实例化问题咨询
实例化失败的核心原因
Heap<T>的泛型约束为 where T : HeapIndex<T>,该约束的明确规则是:作为泛型参数传入的类型T,必须实现以自身T为泛型参数的HeapIndex接口。
两种实现的对比
- 原示例中
Node类的实现为public class Node : HeapIndex<Node>,完全匹配约束要求:泛型参数T是Node,Node刚好实现了HeapIndex<Node>,因此Heap<Node>可以正常实例化。 - 你修改后的
NodeInt类实现为public class NodeInt : HeapIndex<int>,当尝试实例化Heap<NodeInt>时,泛型参数T为NodeInt,约束要求NodeInt必须实现HeapIndex<NodeInt>,但你的NodeInt仅实现了HeapIndex<int>,不满足约束条件,因此实例化失败。
补充说明你写的类型转换代码的问题
你编写的HeapIndex<NodeInt> hpD = nd as HeapIndex<NodeInt> 运行结果必然为null,因为NodeInt没有实现HeapIndex<NodeInt>接口,as转换失败会返回null,后续的hpD as Heap<NodeInt>也自然是null。
如果要让Heap<NodeInt>可以正常实例化,只需要将NodeInt的接口实现修改为public class NodeInt : HeapIndex<NodeInt>,同时对应修改CompareTo方法的参数类型为NodeInt即可。
内容的提问来源于stack exchange,提问作者Novichok2021
相关产品推荐
相关产品推荐

