Let's go straight to it :
Old code :
public interface IFoo {}
public class Foo : IFoo {}
...
public static IFoo Bar() { return new Foo(); }
New code :
public static Foo Bar() { return new Foo(); }
Obviously there should be no problem here, everything you were doing on the old return type, you can still do on the new return type, any is
, as
or cast should behave the same as before...
So did I break binary compatibility, or can I just release it as a minor version without bothering users ?
This breaks binary compatibility, but not (most) compile-time compatibility issues, so it's typically an easy migration.
Note that it can even be a compile-time break if the client code constructs a delegate from the method.
You could have problems with people who have created unit tests around your code. Because it's static people could have created a FooAdapater as follows:-
They could then create a mocked foo adapter than returns a mocked foo. Your code would break this scenario.
So, no it's not binary compatible :-)