与这个问题类似,我想将可选参数与 params 关键字混合,这当然会产生歧义。不幸的是,创建重载的答案不起作用,因为我想利用调用者信息属性,如下所示:
public void Info(string message, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0, params object[] args)
{
_log.Info(BuildMessage(message, memberName, lineNumber), args);
}
创建没有可选参数的重载会更改调用站点,从而阻止这些特定参数正常工作。
我找到了一个几乎可以工作的解决方案(虽然它很丑):
public void Info(string message, object arg0, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0)
{
_log.Info(BuildMessage(message, memberName, lineNumber), arg0);
}
public void Info(string message, object arg0, object arg1, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0)
{
_log.Info(BuildMessage(message, memberName, lineNumber), arg0, arg1);
}
这里的问题是,如果您为最后一个参数指定一个字符串,则重载决议假定您打算memberName
在采用较少参数的重载中显式指定,这不是所需的行为。
有什么方法可以做到这一点(也许使用一些我还没有学过的新属性?)还是我们只是达到了自动魔法编译器支持可以给我们的极限?