Why would having AddInt, AddFloat, AddDouble, AddDecimal, AddByte, AddBigInt have "more readability" than having a single method name that does the same job regardless of the parameter types?
Do you have separate driving tests in your country: DrivingTestFordEscort, DrivingTestFordKa, DrivingTestMercedesAClass, DrivingTestMercedesBClass, ...?
Or do you have a single driving test which allows you to drive a whole class of similar vehicles?
Overloading lets you concentrate on what is happening without focusing on the details, and improves readability and maintainability: if you write your code like this:
for (int i = 0; i < 10; i++)
{
for (int j = 0, j < 10; j++)
{
Console.WriteLine(Add(i, j));
}
}
And then decide you need doubles, it's simple:
for (double i = 0; i < 10; i++)
{
for (double j = 0, j < 10; j++)
{
Console.WriteLine(Add(i, j));
}
}
Because overloading lets you use the "same functionality" without having to find all the instances of AddInt and replace them with AddDouble - the system sorts out which overload is appropriate. This is a trivial example, but if you miss one replacement in a complex piece of code, you introduce a bug, because the system will do some casts for you and you get the "wrong" result: integer division is very different to floating point!
Plus, your example is trivial as well: it's OK when you only want two integers, or twoDoubles, but here is one of my overloaded methods:
public Video Create(string title)
public Video Create(string title, bool temporary)
public Video Create(string title, DateTime productionDate)
public Video Create(Guid id, string title, DateTime productionDate, DateTime
public Video Create(Guid id, string title, DateTime productionDate, DateTime insertDate, bool complete, bool offline = false, bool deleted = false)
public Video Create(Guid id, string title, DateTime productionDate, DateTime insertDate, bool complete, int playCount, bool offline = false, bool deleted = false)
What names are you going to give those, and how are you going to remember them?