命名参数可以与params修饰符一起使用吗?

时间:2012-04-13 13:43:23

标签: c# .net

我尝试使用以下重载在Invoke上调用Dispatcher

public object Invoke(Delegate method, params object[] args);

我想使用命名参数,但我似乎无法使用params修饰符找到参数的语法。以下所有内容都无法编译:

dispatcher.Invoke(method: () => { }, args: {});
dispatcher.Invoke(method: () => { }, args: new object[0]);
dispatcher.Invoke(method: () => { }, args: null);
dispatcher.Invoke(method: () => { }, args: new object[] {});
object[] foo = {};
dispatcher.Invoke(method: () => { }, args: foo);
dispatcher.Invoke(method: () => { }, args: new[] {"Hello", "World!"});

我发现这两个问题似乎没有明确的答案:

Named parameters with params

How to set named argument for string.Format?

所以我的问题是:可以做到吗?如果是,怎么样?

UDPATE

Daniel Hilgarth表明,params可以与命名参数一起使用。我使用这种模式整合了他的答案:

Action method = () => { };
if (_dispatcher != null)
    _dispatcher.Invoke(method: method, args: null);
else
    method();

2 个答案:

答案 0 :(得分:2)

试一试;

dispatcher.Invoke(method: () => { }, args: new[] {"Hello", "World!"});

答案 1 :(得分:2)

以下代码编译没有问题:

void Main()
{
    Invoke(method: () => {}, args: new object[] {});
}

public object Invoke(Action method, params object[] args)
{
    return null;
}

我必须将第一个参数的类型从Delegate更改为Action才能进行编译,因为() => {}无法转换为Delegate

或者,以下也会编译:

void Main()
{
    Action method = () => {};
    Invoke(method: method, args: new object[] {});
}

public object Invoke(Delegate method, params object[] args)
{
    return null;
}

我的假设是你从未得到关于args参数的编译错误,但关于method参数说“无法从'lambda表达式'转换为'System.Delegate'”。通过将lambda转换为Action(Invoke(method: (Action)(() => {}) ...)或通过定义作为参数传递给方法的类型Action的变量(见上文)来解决此问题,因为Action可以隐式转换为Delegate