using System; interface I<T> { } class A { public virtual I<T> Foo<T> () where T : IDisposable { return null; } } class AA : A { public override I<V> Foo<V> () { return base.Foo<V> (); } } class B : AA, IDisposable { public void Dispose () { } public override I<R> Foo<R> () { return base.Foo<R> (); } public static void Main () { new B ().Foo<B> (); } }