I wrote an extension method for String to get a char argument, string.Remove(char). But when I used this, it instead called the default string.Remove(int)
This behavior is correct. The reason is that introducing an extension method should not change the way existing code executes. Code should behave exactly the same with or without this "superfluous" extension method. It may seem counter-intuitive in certain cases (like yours), but happens for a reason.