using System; public class ThisBaseClass<A, B, C> where A: ThisBaseClass<A, B, C> where B: ThatBaseClass<B, A, C>, new() where C: class { } public class ThatBaseClass<B, A, C> where B: ThatBaseClass<B, A, C>, new() where A: ThisBaseClass<A, B, C> where C: class { } public class ThisClass<A, B, C>: ThisBaseClass<A, B, C> where A: ThisClass<A, B, C> where B: ThatClass<B, A, C>, new() where C: class { } public class ThatClass<B, A, C>: ThatBaseClass<B, A, C> where B: ThatClass<B, A, C>, new() where A: ThisClass<A, B, C> where C: class { } public class ThisClass: ThisClass<ThisClass, ThatClass, object> { } public class ThatClass: ThatClass<ThatClass, ThisClass, object> { } public class Test { public static void Main () { } }