ttusharbb Ответов: 2

Проблемы с перегрузкой функций в C#


Если я использую здесь перегрузку функции, то почему она вызывает функцию, которая имеет строку в качестве входного параметра.
Хотя объект также может принимать null.

Что я уже пробовал:

public void show(object a)
        {
			console.writeline("print object");
        }
        
		
		
		static void Main(string[] args)
        {
			show();
		}
		
		Output //print object
		
		public void show(string a)
        {
			console.writeline("print string");
        }
		
		 public void show(object a)
        {
			console.writeline("print object");
        }
        
		
		
		static void Main(string[] args)
        {
			show();
		}
		Output //print string

2 Ответов

Рейтинг:
2

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.
В противном случае вызов будет неоднозначным и завершится неудачей.

Когда вы сравниваете строку и объект, происходит неявное преобразование из строки (потому что все строки также являются объектами), но не наоборот (потому что не все объекты являются строками), поэтому среда выполнения вызывает версию строки.
[/редактировать]


Karthik_Mahalingam

Привет OriginalGriff
если мое понимание-обряд, то ОП пытается спросить
если мы позвоним show(null); почему он печатается "string" вместо "object" с строка и объекта значение по умолчанию null

OriginalGriff

А! Может быть: ответ обновлен.

Karthik_Mahalingam

:)