Рекурсивное наследование в дженериках

Есть класс 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; }
}

Из-за рекурсии возникает ошибки и код не компилируется. Ошибки:

  1. 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>>>'
  2. 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>>>'

Я пытаюсь добиться того, чтобы:

  1. У интерфейса IGamePiece можно было указывать тип TMove - наследника GameMove
  2. У класса GameMove можно было указывать тип TPiece - наследника IGamePiece.

Ответы (0 шт):