Spent some more time on generic constraints. Some things are a bit surprising at first sight and so my first attempt to implement this was wrong:
This example is ok and allowed - you may pass hello to that function since the constraints match. However, the following is not allowed:
The constraints just say that Y must derive from X - but this function still takes a Hello<Y> argument. You cannot interpret the constraints in a way that any generic instance Hello<T> is allowed, if just T derives from Y.