1

为什么在实现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>

我敢肯定,但假设编译器会抱怨,因为解析中INodeIEdge解析时的循环泛型约束NodeBad

  • 要验证NodeBad是 的有效类型TNodeN,它需要知道EdgeBad是 的有效类型TEdgeN
  • 要验证EdgeBad是 的有效类型TEdgeN,它需要知道这NodeBad是 的有效类型TNodeE
  • 要验证NodeBad它是一个有效的类型,TNodeE它需要它是一个有效的类型,TNodeN因为TNodeE它被用作TNodeN约束中的类型interface IEdge
4

0 回答 0