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
は問題が解決しないことを示すために、入力パラメーターとして使用されます。そうでなければ、これはtypeout TEdgeN
を許可する を使用して解決できます。covariant
TEdgeN
// 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>{}
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