Рекурсивное наследование в дженериках
Есть класс Game. Его реализация не важна, можно опустить её до следующего вида:
public class Game {}
Есть интерфейс IGamePiece:
public interface IGamePiece<TGame, TMove>
where TGame : Game
where TMove : GameMove<TGame, IGamePiece<TGame, TMove>>
{
TMove[] GetAvailableMoves(TGame game);
}
и класс GameMove:
public class GameMove<TGame, TPiece>
where TGame : Game
where TPiece : class, IGamePiece<TGame, GameMove<TGame, TPiece>>
{
// public GameBoardSquareCoordinates EndCoordinates { get; }
public TPiece Piece { get; }
}
Из-за рекурсии возникает ошибки и код не компилируется. Ошибки:
The type 'IGamePiece<TGame,TMove>' cannot be used as type parameter 'TPiece' in the generic type or method 'GameMove<TGame,TPiece>'. There is no implicit reference conversion from 'IGamePiece<TGame,TMove>' to 'IGamePiece<TGame,GameMove<TGame,IGamePiece<TGame,TMove>>>'The type 'GameMove<TGame,TPiece>' cannot be used as type parameter 'TMove' in the generic type or method 'IGamePiece<TGame,TMove>'. There is no implicit reference conversion from 'GameMove<TGame,TPiece>' to 'GameMove<TGame,IGamePiece<TGame,GameMove<TGame,TPiece>>>'
Я пытаюсь добиться того, чтобы:
- У интерфейса
IGamePieceможно было указывать типTMove- наследникаGameMove - У класса
GameMoveможно было указывать типTPiece- наследникаIGamePiece.