使用带有可选参数的方法的C#委托

有机会使这段代码有效吗? 当然我可以对Foo做出第二个定义,但我觉得它有点不优雅;)

delegate int Del(int x); static int Foo(int a, int b = 123) { return a+b; } static void Main() { Del d = Foo; } 

您的委托只询问一个参数 ,而您的Foo()方法最多要求两个参数 (编译器为未指定的调用参数提供默认值)。 因此,方法签名是不同的,因此您无法以这种方式关联它们。

要使它工作,你需要重载你的Foo()方法(就像你说的那样),或者使用可选参数声明你的委托:

 delegate int Del(int x, int y = 123); 

顺便提一下,请记住,如果在委托和实现方法中声明了不同的默认值, 则使用委托类型定义的默认值

也就是说,此代码打印457而不是124因为d is Del

 delegate int Del(int x, int y = 456); static int Foo(int a, int b = 123) { return a+b; } static void Main() { Del d = Foo; Console.WriteLine(d(1)); } 

可选参数不会更改方法的签名 。 它们只是声明参数的默认值。 当您在代码中省略它们时, 编译器将使用此信息提供值。 编译后的代码仍会传递所有参数的参数。

在您的情况下,方法Foo仍然被声明为将两个int参数作为输入。 没有版本的Foo只能用一个参数调用 (请记住,编译器会为你填充空白)。 用于调用带有可选参数的方法的任何委托都需要显式包含所有参数以匹配签名。

可选参数不会更改方法的签名,这对委托至关重要。 它似乎只是从调用者的角度更改签名。 使用您尝试使用的方法无法完成您要实现的目标。

请参阅此问题: 委托上的可选参数无法正常工作