C# 使用排除的参数声明委托

C# 使用排除的参数声明委托,c#,C#,我有一个函数 public void foo(string st; bool x) 我必须以委托的方式将其传递给EventHandler: eventhndl += foo 但是,它需要少一个参数。 如何通过声明必须获取的值来排除参数,如以下(不工作)示例中所示: 如果参数的数量没有错误?您可以使用lambda像这样绑定参数: eventHandler += s => foo(s, true); 可以使用lambda绑定参数,如下所示: eventHandler += s =>

我有一个函数

public void foo(string st; bool x)
我必须以委托的方式将其传递给EventHandler:

eventhndl += foo
但是,它需要少一个参数。
如何通过声明必须获取的值来排除参数,如以下(不工作)示例中所示:


如果参数的数量没有错误?

您可以使用lambda像这样绑定参数:

eventHandler += s => foo(s, true);

可以使用lambda绑定参数,如下所示:

eventHandler += s => foo(s, true);

答案很简单:你不能

详细回答:委托代表函数签名,因此它必须与实例指向的函数完全匹配

要解决这个问题,您可以使用C#上的旧方法来处理可选参数、重载:

void myFunction(bool a, bool b)
{
}

void myFunction(bool a)
{
    myFunction(a, true);
}

delegate myDelegate(bool a);
event myDelegate myEvent;
//...

myEvent += myFunction;
通过这种方式,您还可以在代码的其他位置使用重载

或者,如果您喜欢更简洁但可读性较差的代码,则始终可以使用lambda:

myEvent += (a) => myFunction(a, true);

答案很简单:你不能

详细回答:委托代表函数签名,因此它必须与实例指向的函数完全匹配

要解决这个问题,您可以使用C#上的旧方法来处理可选参数、重载:

void myFunction(bool a, bool b)
{
}

void myFunction(bool a)
{
    myFunction(a, true);
}

delegate myDelegate(bool a);
event myDelegate myEvent;
//...

myEvent += myFunction;
通过这种方式,您还可以在代码的其他位置使用重载

或者,如果您喜欢更简洁但可读性较差的代码,则始终可以使用lambda:

myEvent += (a) => myFunction(a, true);

不适用于此案例。“委托不接受1个参数”@Hypixus显然,与您在问题中所说的相反,此事件处理程序不接受一个参数。您需要让匿名方法与该事件的实际委托相匹配。@Hypixus那么解决方案将采用所有参数,例如
eventHandler+=(str,x)=>foo(str,true)@ZdeněkJelínek是的,现在它可以工作了!在最后的代码中,一切只是更多的参数:Radio.StateChanged+=(Radio-Radio,object-sender)=>radioEvent(Radio,sender,false);不适用于此案例。“委托不接受1个参数”@Hypixus显然,与您在问题中所说的相反,此事件处理程序不接受一个参数。您需要让匿名方法与该事件的实际委托相匹配。@Hypixus那么解决方案将采用所有参数,例如
eventHandler+=(str,x)=>foo(str,true)@ZdeněkJelínek是的,现在它可以工作了!在最后的代码中,一切只是更多的参数:Radio.StateChanged+=(Radio-Radio,object-sender)=>radioEvent(Radio,sender,false);