class A {
	double d1,d2;
	public double this[double x] {
		set {
			d1 = x;
			d2 = value;
		}
		get {
			if (d1 == x) {
				return d2;
			}
			return 0.0;
		}
	}
}

class B : A {
	double d1,d2;
	public new double this[double x] {
		set {
			d1 = x;
			d2 = value;
		}
		get {
			if (d1 == x) {
				return d2;
			}
			return 0.0;
		}
	}
}

class C : B{
	string s1,s2;
	int i1,i2;
	public string this[string x] {
		set {
			s1 = x;
			s2 = value;
		}
		get {
			if (s1 == x) {
				return s2;
			}
			return "";
		}
	}
	public int this[int x] {
		set {
			i1 = x;
			i2 = value;
		}
		get {
			if (i1 == x) {
				return i2;
			}
			return 0;
		}
	}
}

struct EntryPoint {

	public static int Main (string[] args) {
		C test = new C();

		test[333.333] = 444.444;
		if (test[333.333] != 444.444)
			return 1;

		test["a string"] = "another string";
		if (test["a string"] != "another string")
			return 2;

		test[111] = 222;
		if (test[111] != 222)
			return 3;

		System.Console.WriteLine ("Passes");
		return 0;
	}

}