Вот код на С# который скомпилирован не будет
1 public class C1
2 { 3 public virtual object A()
4 { 5 return null;
6 }
7 }
8
9 public class C2 : C1
10 { 11 public override string A()
12 { 13 return "foo";
14 }
15 }
Вся беда в том что в классе C2 я всего-лишь пытаюсь сузить возвращаемый тип. При этом с точки зрения ООП и правила Лиски всё в порядке. Более того, аналогичный код прекрасно скомпилируется в Java. Абыдна однако... Для 100% аналогии придётся написать что-то вроде:
1 public class C1
2 { 3 public virtual object A()
4 { 5 return null;
6 }
7 }
8
9 public class C2 : C1
10 { 11 public new virtual string A()
12 { 13 return (string)((C1) this).A();
14 }
15 public override object A()
16 { 17 return "foo";
18 }
19 }