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

我正在使用一些代码,它有七个函数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)在其他地方,我用四个参数调用TraceWritestring, LogLevelENUM, string, bool ,我得到以下错误:

 错误CS1502:'TraceWrite(string,LogLevelENUM,string,string)'的最佳重载方法匹配有一些无效的参数
错误CS1503:参数'4':无法从'bool'转换为'string' 

为什么这个调用不能解决第二个重载? ( TraceWrite(string, LogLevelENUM, string, bool, string = "")

2)如果我用string, LogLevelENUM, string, string调用TraceWrite ,将调用哪个重载? 第一个还是第三个? 为什么?

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

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

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

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

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