interface IFoo<in T> where T : Bar {
Do(T bar);
}
Is it possible to break anything by removing the constraint on T?
I don't think you can break any implementation of IFoo because they either implement it with a concrete type MyFoo : IFoo<MyBar>, or they declare the same / a stronger constraint when the implementation is generic itself MyFoo<T> : IFoo<T> where T : MyBar.
I also don't think you can break any usages of the interface, because again such a method either passes a concrete type foo.Do(new MyBar) or it declares the same / a stronger constraint UseFoo<T>(...) where T : MyBar.
Am I missing any situation where even a binary backwards incompatibility could arise?