Разрешение перегрузки и дополнительные параметры в C # 4 - PullRequest
4 голосов
/ 17 июня 2010

Я работаю с некоторым кодом, имеющим семь перегрузок функции TraceWrite:

void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, string Data = "");
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, bool LogToFileOnly, string Data = "");
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, string PieceID, string Data = "");
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, LogWindowCommandENUM LogWindowCommand, string Data = "");
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, bool UserMessage, int UserMessagePercent, string Data = "");
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, string PieceID, LogWindowCommandENUM LogWindowCommand, string Data = "");
void TraceWrite(string Application, LogLevelENUM LogLevel, string Message, LogWindowCommandENUM LogWindowCommand, bool UserMessage, int UserMessagePercent, string Data = "");

(Все общедоступные статические шумы в пространстве имен исключены выше и повсюду).* Итак, на этом фоне:
1) В другом месте я вызываю TraceWrite с четырьмя аргументами: string, LogLevelENUM, string, bool, и я получаю следующие ошибки:

error CS1502: The best overloaded method match for 'TraceWrite(string, LogLevelENUM, string, string)' has some invalid arguments
error CS1503: Argument '4': cannot convert from 'bool' to 'string'

Почему этот вызов не разрешаетсяко второй перегрузке?(TraceWrite(string, LogLevelENUM, string, bool, string = ""))

2) Если бы я позвонил TraceWrite с string, LogLevelENUM, string, string, какая перегрузка была бы вызвана?Первый или третий?И почему?

Ответы [ 2 ]

2 голосов
/ 17 июня 2010

Компилятор выберет перегрузку # 1, поскольку он точно соответствует количеству параметров и сигнатуре.

0 голосов
/ 17 июня 2010

Ваши перегрузки плохие, вы должны иметь больше различий между ними. Компилятор не может знать, имели ли вы в виду первое или третье.

Либо у третьего не должно быть значения по умолчанию для последнего аргумента, у первого должен быть другой нестроковый аргумент перед последней строкой, либо аргумент PieceID третьего должен быть целым числом.

Существует другое возможное лучшее решение: использовать несколько значений по умолчанию. У вас так много значений по умолчанию, что они должны уменьшить количество перегрузок. С несколькими значениями по умолчанию вы можете вызвать метод, указав только последнее значение. Надеюсь, вы можете уменьшить количество перегрузок до 1 или 2.

public static int add(int a = 0, int b = 0)
{
    return a + b;
}
add(b: 1);
...