using System; struct S : IDisposable { public void Dispose () { } } class A where T : IDisposable { public virtual bool Test (U u) where U : T { using (u) { return false; } } } class B : A { public override bool Test (U u) { using (u) { return true; } } public static int Main () { var b = new B (); if (!b.Test (new S ())) return 1; return 0; } }