using System;

interface ITargetInfo
{
	int TargetIntegerSize {
		get;
	}
}

interface ITargetMemoryAccess : ITargetInfo
{
}

interface IInferior : ITargetMemoryAccess
{
}

interface ITest
{
	int this [int index] {
		get;
	}
}

class Test : ITest
{
	public int this [int index] {
		get { return 5; }
	}

	int ITest.this [int index] {
		get { return 8; }
	}
}

class D : IInferior
{
	public int TargetIntegerSize {
		get { return 5; }
	}

	int Hello (IInferior inferior)
	{
		return inferior.TargetIntegerSize;
	}

	static int Main ()
	{
		D d = new D ();

		if (d.Hello (d) != 5)
			return 1;

		Test test = new Test ();
		ITest itest = test;

		if (test [0] != 5)
			return 2;
		if (itest [0] != 8)
			return 3;

		return 0;
	}
}
