gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:25:19 24 4
gpt4 key购买 nike

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

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?

所以我的问题是:能不能做?如果是,如何?

更新

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

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

最佳答案

下面的代码编译没有问题:

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

关于c# - 命名参数可以与 params 修饰符一起使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10142005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com