Why these code is valid: class A { public char[] test() { return "A"; } } class B : A { } class C : B { public char[] test() { return super.test() ~ " C"; } } But these are not? class A { public char[] test() { return "A"; } } class B : A { public void test(char[] a) { } } class C : B { public char[] test() { return super.test() ~ " C"; } }