使用带有可选参数的方法的C#委托人
问题描述:
是否有机会使此代码有效?当然,我可以让美孚的第二个定义,但我觉得这是一个有点不优雅;)使用带有可选参数的方法的C#委托人
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));
}
答
可选参数不改变的方法,这是代表关键的签名。它只有出现以从调用者的角度更改签名。您尝试使用您尝试使用的方法无法完成。
看到这个问题: Optional parameters on delegates doesn't work properly
答
可选参数不改变方法的签名。他们只是声明参数的默认值。 编译器使用此信息在您的代码中省略它们时提供值。编译后的代码仍然会传递所有参数的参数。
在你的情况下,方法Foo
仍然宣布为采用两个int
参数作为输入。没有Foo
的版本,可以是只用一个参数调用(请记住,编译器在那里为你填空)。任何用于调用具有可选参数的方法的委托都需要显式包含所有参数以匹配签名。
方法签名必须匹配委托签名。你能更具体地描述你的意图吗? – Groo 2011-04-20 10:59:34
@格罗 - 我在写数字理论库,我有一个委托bool PrimalityTest(BigInteger n)。我还有一些素性测试,其中一些是“参数化”的,例如Miller-Rabin进行了一些测试或优选基础。 – PMichalak 2011-04-20 11:09:45
我不认为这是问题的重复,询问您是否可以将可选参数放入委托类型声明中 - 这是关于具有可选参数的方法是否可以匹配忽略该参数的委托签名。 – 2013-12-22 09:06:07