public static void Main()
public interface StartType0<out T1, out T2> where T1 : StartType1 where T2 : StartType2 { }
public class StartType1 { }
public class StartType2 { }
public class EndType0 : StartType0<EndType1, EndType2> { }
public class EndType1 : StartType1 { }
public class EndType2 : StartType2 { }
public interface ITypeContainer<out T> where T : StartType0<StartType1, StartType2>
public class TypeContainer<T> : ITypeContainer<T> where T : StartType0<StartType1, StartType2>, new()
public T[] array { get; } = new T[1];
public T Get(int i) => array[i];
public ITypeContainer<EndType0> container = new TypeContainer<EndType0>();
EndType0 instance = container.array[0];