Ok, after playing around with your sample I discovered the trick to the bug is that the types have to be generic. If you try this code:
public abstract class testFindRefBaseClassCS<T>
{
public testFindRefBaseClassCS() { }
protected abstract string displayName();
protected abstract testFindRefBaseClassCS<T> cloneMe();
}
class testFindRefChildOneCS<T> : testFindRefBaseClassCS<T>
{
public testFindRefChildOneCS() { }
protected override string displayName() { return "child class"; }
protected override testFindRefBaseClassCS<T> cloneMe() { return new testFindRefChildOneCS<T>(); }
}
class testFindRefGrandChildOneCS<T> : testFindRefChildOneCS<T>
{
public testFindRefGrandChildOneCS() { }
protected override string displayName() { return "grandchild class"; }
protected override testFindRefBaseClassCS<T> cloneMe() { return new testFindRefGrandChildOneCS<T>(); }
}
It doesn't provide the right reference walking.