Most people assume the DoSomething(int) overload on the base class is a better match than the DoSomething(long) overload.
However, since the variable is a derived type, that version of DoSomething will be called. The .NET runtime always favors the most-derived compile-time type.
If it finds a method signature that will work on the derived type it will use that before moving to any of the base class methods. In general, you should avoid overloading methods defined in base classes.