using System;

class A<D1, D2, D3>
{
	public virtual void Foo<T> () where T : D2
	{
	}
}

class B<DD2> : A<int, DD2, short>
{
}

class C : B<string>
{
	public override void Foo<T> ()
	{
	}
}

public class Program
{
	public static void Main ()
	{
		new C ().Foo<string> ();
	}
}