using System; class A { public virtual void Foo () where T : D2 { } } class B : A { } class C : B { public override void Foo () { } } public class Program { public static void Main () { new C ().Foo (); } }