public class Test
{
	private static int DoTest (string type, string expected, string actual, int failcode)
	{
		if (!actual.Equals (expected)) {
			System.Console.WriteLine ("Bad {0}: Expected {1}, Was {2}",
							   type, expected, actual);
			return failcode;
		}
		return 0;
	}

	public static int Main ()
	{
		int failure = 0;
		Concrete val = new Concrete ();

		failure |= DoTest ("A", "A", ((A) val).Spec, 0x01);
		failure |= DoTest ("B", "B", ((B) val).Spec, 0x02);
		failure |= DoTest ("C", "B", ((C) val).Spec, 0x04);
		failure |= DoTest ("Concrete", "Concrete", val.Spec, 0x08);

		return failure;
	}
}

interface A
{
	string Spec { get; }
}

interface B : A
{
	new string Spec { get; }
}

interface C : B
{
}

class Concrete : C
{
	string A.Spec { get { return "A"; } }
	string B.Spec { get { return "B"; } }
	public string Spec { get { return "Concrete"; } }
}