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

PMi*_*lak 15 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;
}
Run Code Online (Sandbox Code Playgroud)

Bol*_*ock 15

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

要使其工作,您需要重载您的Foo()方法(如您所说),或使用可选参数声明您的委托:

delegate int Del(int x, int y = 123);
Run Code Online (Sandbox Code Playgroud)

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

也就是说,此代码打印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));
}
Run Code Online (Sandbox Code Playgroud)


Fre*_*örk 5

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

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