namespace A { public interface IExtensible { void AddAll (U u) where U : T; } public class ArrayList : IExtensible { void IExtensible.AddAll (U u) { InsertAll (u); } void InsertAll (T t) { } } } namespace B { public interface IExtensible { void AddAll (U t) where U : S; } public class ArrayList : IExtensible { public void AddAll (Z z) where Z : Y { InsertAll (z); } void InsertAll (Y y) { } } } namespace C { public interface IExtensible { void AddAll (T t) where T : S; } public class Foo { } public class ArrayList : IExtensible> { public void AddAll (Y y) where Y : Foo { InsertAll (y); } void InsertAll (Foo foo) { } } } class X { public static void Main () { } }