class Base { void foo(string s){} } class Derived: Base { alias Base.foo foo; void foo(long s){} } So far so good. Now add new method to the Base class. class Base { void foo(string s){} void foo(int s){} } Now behavior of the calling code silently changes.