2015-05-29 4 views
2

Почему перегрузка, как это работает в C#?Метод Перегрузка с отсутствующим и необязательным параметром

public string DisplayOverload(string a, string b, string c = "c") 
{ 
    return a + b + c; 
} 
public string DisplayOverload(string a, string b, out string c) 
{ 
    c = a + b; 
    return a + b; 
} 

в то время как это не работает

public string DisplayOverload(string a, string b, string c = "c") 
{ 
    return a + b + c; 
} 
public string DisplayOverload(string a, string b, string c) 
{ 
    return a + b + c; 
} 
+0

Перегрузка метода основана на количестве аргументов и типах аргументов –

+0

Последние 2 являются одной и той же подписью. Первые 2 отличаются друг от друга, поскольку у него есть параметр out. –

+0

Первый может «работать», но это все еще запах кода. Делают разные вещи, поэтому давайте им разные имена. –

ответ

3

out и ref являются считаются частью подписи метода.

От $3.6 Signatures and overloading;

Обратите внимание, что любые модификаторы параметров ref и out (раздел 10.5.1) являются частью подписи . Таким образом, F(int) и F(ref int) являются уникальными сигналами .

Ваш второй пример, c is optional argument. Даже если вы вызываете без этого значения параметра, вызываемый 3-х параметр перегруженный метод, но компилятор не может знать, какой из них вызывать.

Для получения дополнительной информации, проверьте Eric Lippert's answer по этой теме.

0

Метод с выходным параметром будет иметь различную подпись, а метод с необязательным параметром может иметь одну и ту же подпись.

Работает отлично

DisplayOverload(string a, string b, string c)

DisplayOverload(string a, string b, out string c)

не будет работать, так как подпись такая же

DisplayOverload(string a, string b, string c) - опция c всегда устанавливается либо по умолчанию или другое значение

DisplayOverload(string a, string b, string c)

0

Потому что со второй парой определений компилятор не сможет сказать DisplayOverload("aa", "bb", "cc") (если вы имеете в виду это для первой функции) из DisplayOverload("aa", "bb", "cc") (если вы имеете в виду это для sencond одного).

С другой стороны, компилятор довольно легко отличить string c; DisplayOverload("aa", "bb", c) и string c; DisplayOverload("aa", "bb", out c). Обратите внимание на out при последнем звонке.

Смежные вопросы