I was working a bit on the 'ambiguous match'-thing for properties and ran into a weird thing using CAST, where I couldn't cast from a subclass to its super, both being quite vanilla. The problematic line is this from InvocationResult.cpp
if (oldType->IsAssignableFrom(newType)) {
I'm pretty sure this is supposed to be
if (newType->IsAssignableFrom(oldType)) {
This fixes the case I had problems with, but ufortunately reveals another problem in the Excel example, where now this no longer works:
(cast [get_Item worksheets 1] "Worksheet")
The object returned is a com-object returned as a System.Object, and the cast fails with "object must implement IConvertible". It's possible to cast the worksheet to System.__ComObject, but that doesn't help. This seemed to work earlier only because the first test was inverted, thus returning true in this case and forcing the container-type to the correct value. I'll try to find the source of this.
The 'fix' for the ambiguos-match-thing, by the way, tries to simulate what C# does by searching the base classes of the object queried when the exception occured, thus letting one retrieve the 'other' property by casting to the appropriate superclass. That is, if one has classes A, B and C, with A > B > C, and A and B each defining a property with different return-type, then (property C) will return the one defined in B, whereas (property (cast C A)) will return the one defined in A. And that is how I found the issue with CAST.
I put 'fix' in quotes because this is obviously not really neccessarily how things should work; C# is one thing but the .Net methods would more naturally just take the desired return-type as an argument where the property is ambiguous. But I think perhaps this is more intuitive (given C#'s behaviour), syntactically simpler, and also it seemed like good excercise.
Regards, Iver