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

时间:2011-04-20 10:56:20

标签: c# delegates optional-parameters

是否有机会使此代码有效?当然我可以对Foo做出第二个定义,但我认为它有点不优雅;)

delegate int Del(int x);

static int Foo(int a, int b = 123)
{ 
    return a+b; 
}

static void Main()
{
    Del d = Foo;
}

3 个答案:

答案 0 :(得分:14)

您的代表要求一个参数,而您的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));
}

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

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

看到这个问题: Optional parameters on delegates doesn't work properly