c# - 参数 : (required, optional) vs (required, required, optional)

标签 c# overloading optional-parameters

我定义了以下方法:

void Write(string fileContent, string fileName, string container = StorageBlobContainers.ProfilePictures)

代码编译没有问题,所以我写了代码来执行它(来自不同的文件):

string json = JsonConvert.SerializeXNode(node);
FileProcessor.Write(json, "productscontainer");

但由于某种原因,它似乎什么也没做。
经过几分钟努力理解问题后,我终于找到了它。在同一个类的某处,已经有一个 Write 函数定义如下:

void Write(string filePath, string container = StorageBlobContainers.ProfilePictures)
{
  if (!File.Exists(filePath))
    return string.Empty;
  ...

这真的让我很困惑,因为它编译得很好,当然,这是有道理的,因为一个方法有 3 个参数签名而另一个方法有 2 个,但这不是非常模棱两可和/或容易出错吗?对我来说,似乎没有一种方法是“合乎逻辑的”选择。为什么选择第二个而不是另一个?

最佳答案

是的,方法解析可能很棘手,所以在编写多个重载时始终记住这一点。他们不应该像现在这样对你模棱两可。编译器只是选择了最短的匹配,这是它应该做的,因为它被记录为这样做。

您可以做两件事:

  • 重命名其中一种方法。对于您和编译器而言,这将使方法解析变得轻而易举,而且绝对清晰。
  • 使两者都需要最后一个参数。这将使方法解析再次变得非常清晰:两个参数与三个参数。

关于c# - 参数 : (required, optional) vs (required, required, optional),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37989181/

相关文章:

c# - User3 2's ShowWindow doesn' t 按预期行事

c# - 如何比较两个数据表的单元格值

c# - Entity Framework : RowVersion value is null

Java:抽象泛型类和方法重载顺序

c# - 如何使用 SQL Server 将可为空的 guid 声明为 C# CLR 存储过程的可选参数

php - 引用类变量作为 PHP 函数中的默认参数

c - MSVC : "too few arguments in function call" when omitting optional parameter

c# - StringBuilder 中的换行符

fortran - Fortran 2008 中的函数重载

c# - 为什么要重载 true 和 false 而不是定义 bool 运算符?