【发布时间】:2020-11-17 18:26:35
【问题描述】:
我有一个方法:
public delegate void SubscriberAction(string a, string b = null);
我的方法
public void Subscribe(SubscriberAction action)
{
var consumer = new EventingBasicConsumer(Channel);
consumer.Received += (model, eventArgs) =>
{
try
{
var body = eventArgs.Body;
action?.Invoke(Encoding.UTF8.GetString(body), eventArgs.RoutingKey);
// The above works when I call it with one or two strings
}
finally
{
Channel.BasicAck(eventArgs.DeliveryTag, false);
}
};
Channel.BasicConsume(Configuration.QueueName, false, consumer);
}
当我如上所示调用此操作时,它确实识别出可选参数,我可以按预期调用它。但是,采用此委托参数的 Subscribe 方法不会让我按照自己的意愿调用它。
所以这行不通:
subscriber.Subscribe(x =>
{
// do stuff
});
只有在我这样做时才有效
subscriber.Subscribe((x, y) =>
{
// do stuff
});
最初我使用Action<string> action 作为Subscribe 的参数,但需要添加一个可选的第二个字符串参数,并且由于Action 不允许可选参数(如果我错了,请纠正我),我找到了一个答案说像我上面所做的那样使用自定义委托。
如何使用一个或两个参数调用Subscribe 方法?
【问题讨论】:
-
看来这是duplicate。简短的回答是调用委托需要所有参数;编译器“作弊”并在“正常”情况下为您插入额外的参数。但是当定义一个委托(例如创建一个lambda函数)时,所有的参数都是需要的。
标签: c# delegates optional-parameters