重载的方法在 Resharper 中给出“带有可选参数的方法被重载隐藏”警告

Posted

技术标签:

【中文标题】重载的方法在 Resharper 中给出“带有可选参数的方法被重载隐藏”警告【英文标题】:Overloaded methods give "Method with optional parameter is hidden by overload" warning in Resharper 【发布时间】:2013-05-08 22:47:26 【问题描述】:

我有一些执行日志记录的 C# 应用程序,Output 方法有一个重载来接受消息和一个 StreamWriter,另一个重载带有一个用于 params 数组的附加参数。方法签名的一个例子是:

private static void Output(string message, StreamWriter writer, params object[] args) 
..

private static void Output(string message, StreamWriter writer) 
..

问题涉及 Resharper,它为这些方法提供以下警告:“具有可选参数的方法被重载隐藏”。

该警告具有误导性,因为我从 3 参数重载内部调用 2 参数重载并且它不会导致递归调用,因此不会隐藏重载。

我在 Resharper 网站上进行了一些研究,并且有一些关于这个问题的票已被关闭,因为“无法修复”。

在我看来,这是一个有效的用例,因为运行时知道要调用哪个重载。 .NET 框架中也有使用此类重载的示例。

例如,StreamWriter.WriteLine() 具有要写入的值的重载,还有 Format params

这是一个有效的参数,还是应该将我的方法重命名为“OutputFormat”,因为他们在幕后使用 string.Format 来构建具有指定参数的字符串?

【问题讨论】:

【参考方案1】:

据我所知,您的帖子中有两个问题。

首先,如果你觉得你的方法可以重命名为更明显的东西,那就继续吧,这将在许多方面(可读性、可用性等)改进你的代码,无论如何他们应该这样做尽可能详细地描述他们的工作。

第二,关于 Resharper 警告:

使用重载函数的递归并不一定意味着或导致您看到的警告。

你可能知道重载函数最常用于当函数的参数有不同类型时,但函数做同样的事情,例如:

private static void Print(int i) ...

private static void Print(bool b) ...

但是,如果函数被重载并且该重载具有完全相同的参数类型以及可选参数,则很可能存在设计问题。 p>

基本解释

如果你有这样的事情:

private static void Print(string message) ...

private static void Print(string message, string messageDelimiter = "===\n") ...

当你从你的类中调用 Print 函数时,因为当你调用它们时这两个函数看起来都是一样的:Print("my message"); 带有可选参数的那个是隐藏的。

因此,您可以像这样简单地合并它们:

private static void Print(string message, string messageDelimiter = "===\n") ...

此外

您可能还想做一些更聪明的事情,例如让用户访问一个公共功能,同时使用这样的可选参数限制一个:

public static void Print(string message) ... //< As you can see this one is public

private static void Print(string message, string messageDelimiter = "===\n") ...

即使那样的话,你也会遇到同样的问题。

IMO,一个好的经验法则是问自己几个问题:

可选参数在哪里真的有意义吗? 函数真的需要同名吗? 参数真的应该是可选的吗?

如果您对所有这些都回答,则可以忽略 Resharper 评论并让您的代码保持原样。

【讨论】:

感谢您的解释。就我而言,我有一个方法可以将静态消息写入日志文件和控制台,还有一个方法可以写入带有参数列表的消息,在幕后调用 string.Format。我对此的想法略有不同,但在您的解释之后,很明显该方法确实是隐藏的,所以这个警告确实有道理。

以上是关于重载的方法在 Resharper 中给出“带有可选参数的方法被重载隐藏”警告的主要内容,如果未能解决你的问题,请参考以下文章

ReSharper快捷键

带有可选路径参数的简单 React 路由器给出“TypeError:无法读取未定义的属性“过滤器”

带有可选参数的扩展方法中的方法解析

Resharper 的快捷键

构造方法的重载

Resharper快捷键汇总