我正在使用一些具有函数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
,会调用哪个超载?第一个还是第三个?为什么?
答案 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);