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>>{}

TEdgeNvoid AddIncoming(TEdgeN edge)は、このシナリオでout TEdgeNは問題が解決しないことを示すために、入力パラメーターとして使用されます。そうでなければ、これはtypeout TEdgeNを許可する を使用して解決できます。covariantTEdgeN

// This compiles
class EdgeGood : IEdge<NodeGood>{}
class NodeGood : INode<NodeGood, IEdge<NodeGood>>{}

上記のIEdge<NodeGood>for typeTEdgeNは有効ですが、なぜEdgeBadが無効な type なのか疑問に思っていますTEdgeN

//This does not compile ...
class NodeBad : INode<NodeBad,EdgeBad>{} // error type NodeBad
class EdgeBad : IEdge<NodeBad>{} // error type NodeBad 

私は十分に認識しており、何かを監視していますが、すべきではありません:

class EdgeBad : IEdge<NodeBad>{}

TEdgeNinの有効な型であること

class NodeBad : INode<TNodeN,TEdgeN>

私は確信していますが、解決中INodeおよび IEdge解決時の循環的な一般的な制約のために、コンパイラが不平を言うと仮定しますNodeBad:

  • が の有効なタイプであることを確認するNodeBadには、 が の有効なタイプでTNodeNあることを知る必要がありEdgeBadます。TEdgeN
  • EdgeBadが の有効な型であることを確認するには、 が の有効な型であることTEdgeNを知る必要があります。NodeBadTNodeE
  • NodeBadが有効な型であることを確認するには、次の制約で型として使用されるTNodeEため、有効な型である必要があります。TNodeNTNodeETNodeNinterface IEdge
4

0 に答える 0