为什么除了一个可选参数之外,还允许有两个相同的方法签名

本文关键字:两个 方法 一个 为什么 参数 | 更新日期: 2023-09-27 17:59:39

public static bool TryGetDbRow(DbConnection cnctn, string indexName = null)
public static bool TryGetDbRow(DbConnection cnctn)

如果没有字符串作为最后一个参数,就永远不会调用第一个。为什么除了一个可选参数之外,还允许有两个相同的方法签名?

为什么除了一个可选参数之外,还允许有两个相同的方法签名

这是Eric Lippert在他的博客上解释的http://blogs.msdn.com/b/ericlippert/archive/2011/05/16/optional-argument-corner-cases-part-three.aspx

创建具有可选参数的方法时,方法签名包括所有参数,包括任何可选参数。

因此,在您的示例中,这些方法有不同的签名——第一个有2个参数,第二个只有1个。当你只有第一个方法,并且你用1个参数调用该方法时,例如

TryGetDbRow("connection");

编译器将其更改为

TryGetDbRow("connection", null);

但是,当您添加不带可选参数的第二个方法时,编译器会为带有单个参数的方法找到匹配项,并且不会插入可选参数,因此会调用第二个。

从方法定义的角度来看,可选参数实际上并不是可选的。编译器只是对调用代码应用一些"语法糖",并为任何丢失的可选参数添加所有默认值。