C#4中的过载分辨率和可选参数

时间:2010-06-17 13:16:25

标签: c# overloading optional-parameters overload-resolution

我正在使用一些具有函数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 个答案:

答案 0 :(得分:2)

编译器将选择重载#1,因为它与参数数量和签名完全匹配。

答案 1 :(得分:0)

你的超载很糟糕,你应该在它们之间做出更大的改变。编译器无法知道您是指第一个还是第三个。

第三个应该没有最后一个参数的默认值,第一个应该在最后一个字符串之前有一个不同的非字符串参数,或者第三个的PieceID参数应该是一个int。

有一种不同的可能更好的解决方案:使用多个默认值。你有这么多的默认值,他们应该减少重载次数。使用多个默认值,您可以仅指定最后一个值来调用方法。希望您可以将重载次数减少到1或2。

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