为什么在实现class Node
中泛型类型IEdge<Node>
不能被具体实现所取代class Edge:IEdge<Node>
。
// For interface definitions INode and IEdge
interface INode<TNodeN, TEdgeN>
where TNodeN : INode<TNodeN, IEdge<TNodeN>>
where TEdgeN : IEdge<TNodeN>{
void AddIncoming(TEdgeN edge); //TEdgeN used as in, (Thanks Evk - see comments!)
}
interface IEdge<TNodeE>
where TNodeE : INode<TNodeE, IEdge<TNodeE>>{}
TEdgeN
用作输入参数void AddIncoming(TEdgeN edge)
以表明在这种情况下out TEdgeN
不能解决问题。否则,这可以使用 来解决out TEdgeN
,这将允许一个covariant
类型TEdgeN
。
// This compiles
class EdgeGood : IEdge<NodeGood>{}
class NodeGood : INode<NodeGood, IEdge<NodeGood>>{}
虽然上述,IEdge<NodeGood>
对于类型TEdgeN
是有效的,我想知道为什么EdgeBad
是一个无效的类型TEdgeN
,例如:
//This does not compile ...
class NodeBad : INode<NodeBad,EdgeBad>{} // error type NodeBad
class EdgeBad : IEdge<NodeBad>{} // error type NodeBad
我完全清楚,我正在监督一些事情,但不应该:
class EdgeBad : IEdge<NodeBad>{}
TEdgeN
是in的有效类型
class NodeBad : INode<TNodeN,TEdgeN>
我敢肯定,但假设编译器会抱怨,因为解析中INode
和 IEdge
解析时的循环泛型约束NodeBad
:
- 要验证
NodeBad
是 的有效类型TNodeN
,它需要知道EdgeBad
是 的有效类型TEdgeN
- 要验证
EdgeBad
是 的有效类型TEdgeN
,它需要知道这NodeBad
是 的有效类型TNodeE
- 要验证
NodeBad
它是一个有效的类型,TNodeE
它需要它是一个有效的类型,TNodeN
因为TNodeE
它被用作TNodeN
约束中的类型interface IEdge