Hi, Here is the patch file for expression.cs in -u format. I send the testcase again. Ah, the fix works in 0.19 and in CVS (I had broken cvs tree).
See you, Pedro -- Pedro Martinez Juliá \ [EMAIL PROTECTED] )| [EMAIL PROTECTED] / http://yoros.cjb.net Socio HispaLinux #311 Usuario Linux #275438 - http://counter.li.org GnuPG public information: pub 1024D/74F1D3AC Key fingerprint = 8431 7B47 D2B4 5A46 5F8E 534F 588B E285 74F1 D3AC
Index: expression.cs =================================================================== RCS file: /mono/mcs/mcs/expression.cs,v retrieving revision 1.396 diff -u -r1.396 expression.cs --- expression.cs 9 Jan 2003 22:24:40 -0000 1.396 +++ expression.cs 25 Jan 2003 03:12:36 -0000 @@ -6848,6 +6848,7 @@ public override Expression DoResolve (EmitContext ec) { + ArrayList AllGetters = new ArrayList(); if (!CommonResolve (ec)) return null; @@ -6861,27 +6862,18 @@ Type lookup_type = indexer_type; while (lookup_type != null) { ilist = Indexers.GetIndexersForType (current_type, lookup_type, loc); - - if (ilist == null) { - lookup_type = lookup_type.BaseType; - continue; - } - - found_any = true; - - // - // Step 2: find the proper match - // - if (ilist.getters != null && ilist.getters.Count > 0) { - found_any_getters = true; - get = (MethodInfo) Invocation.OverloadResolve ( - ec, new MethodGroupExpr (ilist.getters, loc), arguments, loc); - - if (get != null) - break; + if (ilist != null) { + foreach (object o in ilist.getters) { + AllGetters.Add(o); + } } - lookup_type = lookup_type.BaseType; + } + if (AllGetters.Count > 0) { + found_any = true; + found_any_getters = true; + get = (MethodInfo) Invocation.OverloadResolve ( + ec, new MethodGroupExpr (AllGetters, loc), +arguments, loc); } if (!found_any) {
using System; class A { public object this[double x] { get { return 3*x; } } } class B : A { public new object this[double x] { get { return x; } } } class C : B{ public object this[string s] { get { return s; } } public object this[int x] { get { return x; } } } struct EntryPoint { public static void Main (string[] args) { C test = new C(); Console.WriteLine("Double (333.333): "+test[333.333]); Console.WriteLine("String (a string): "+test["a string"]); Console.WriteLine("Integer (111): "+test[111]); } }