public class Z : IGenericInterface { public void Stop () { } Z IGenericInterface.Start () { return this; } } public interface IGenericInterface { T Start (); } public class A where Y : Z, IGenericInterface where Y2 : class where W : Y, Y2 { public void SomeOperation (W w) { w.Start (); w.Stop (); } public void SomeOtherOperation (Y y) { y.Start (); y.Stop (); } } public class Foo { public static int Main () { var a = new A (); a.SomeOperation (new Z ()); a.SomeOtherOperation (new Z ()); return 0; } }