[英]Overload Resolution and Optional Parameters in 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) 在其他地方,我使用四个参数调用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) 如果我用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);
对于第二个问题,您的调用将被解析为第一个重载,因为它的签名具有较少的参数。
如果您希望将其解析为第三个重载,请在调用中使用命名参数,例如:
TraceWrite("string", LogLevelENUM.Level, "string", PieceID: "string");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.