Не совсем понятно, в чем проблема - да, у вас есть циклические зависимости в ваших универсальных типах, но это работает.
У меня есть похожая «проблема» в Буферы протокола : у меня есть «сообщения» и «составители», и они идут парами. Итак, интерфейсы выглядят так:
public interface IMessage<TMessage, TBuilder>
where TMessage : IMessage<TMessage, TBuilder>
where TBuilder : IBuilder<TMessage, TBuilder>
и
public interface IBuilder<TMessage, TBuilder> : IBuilder
where TMessage : IMessage<TMessage, TBuilder>
where TBuilder : IBuilder<TMessage, TBuilder>
Это, конечно, некрасиво, но работает. Что вы хотите, чтобы иметь возможность выразить то, что вы не можете выразить в настоящее время? Некоторые мои мысли об этом вы можете увидеть в моем блоге . (Части 2 и 3 серии о буферах протоколов здесь наиболее актуальны.)
(Кроме того, это сделало бы ваш код более обычным, если бы вы добавили префикс T
к параметрам вашего типа. В настоящее время похоже, что State
и Value
являются просто классами.)