OriginalGriff
Потому что вы всегда вызываете одну и ту же версию - версию, которая не принимает никаких параметров.
Попробовать это:
public void show()
{
Console.WriteLine("print no parameter");
}
public void show(object a)
{
Console.WriteLine("print object");
}
public void show(string a)
{
Console.WriteLine("print string");
}
static void Main(string[] args)
{
show();
show(123);
show("123");
}
И он должен работать так, как вы ожидаете.
[редактировать]
Если Картик Бангалор прав, и вы хотите знать, почему нулевой параметр вызывает вызов Строковой версии, то ссылка, которую он дает, не рассказывает всей истории; это немного сложнее, чем это!
Если у вас есть две перегрузки:
public void show(TypeA a){}
public void show(TypeB b){}
И вы вызываете его с нулевым значением, а затем .NET runtime должен решить, что является наиболее подходящим, и это работает следующим образом:
Если нет преобразования из null в TypeB, потому что это тип значения, но TypeA является ссылочным типом, то вызов будет выполнен к методу TypeA.
В противном случае, если есть неявное преобразование из TypeA в TypeB, но нет неявного преобразования из TypeB в TypeA, то будет вызвана перегрузка с использованием TypeA.
Если есть неявное преобразование из TypeB в TypeA, но нет неявного преобразования из TypeA в TypeB, то будет вызвана перегрузка с использованием TypeB.
В противном случае вызов будет неоднозначным и завершится неудачей.
Когда вы сравниваете строку и объект, происходит неявное преобразование из строки (потому что все строки также являются объектами), но не наоборот (потому что не все объекты являются строками), поэтому среда выполнения вызывает версию строки.
[/редактировать]