【问题标题】:Can named arguments be used with the params modifier?命名参数可以与 params 修饰符一起使用吗?
【发布时间】:2012-04-13 13:43:22
【问题描述】:

我正在尝试使用以下重载在 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?

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

UDPATE

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

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

【问题讨论】:

  • 第一个问题是我的,似乎没有办法。你必须不带参数。
  • 你说“好像”;最好有一个明确的答案;-)
  • 请指定确切的编译器错误。当我将Delegate 更改为Action 时,它对我有用,所以这不是params 关键字的问题。
  • @ChuckNorris:原来是可以做到的......
  • 不是他想要的方式。他想做这样的事情:dispatcher.Invoke(method: method, args: "Hello", "World");。请注意,没有传递给命名参数args 的数组,而是一个逗号分隔值的列表。

标签: c# .net


【解决方案1】:

以下代码编译没有问题:

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 可以隐式转换为 @ 987654332@.

【讨论】:

  • +1 这个词不仅很好,而且帮助我创建了我认为更具可读性的代码。我会更新到 demosntrate。
  • @sixfeetsix:是的,新代码看起来非常漂亮和干净,除了首先不必要地使用命名参数;-)
【解决方案2】:

试一试;

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

【讨论】:

  • 其实是的 :) 它也不起作用;我会把它添加到我的列表中。
  • @MartinLiversage 我希望没有问题。像下面这样;对象[] a = 新对象[] { "x", "y" };
  • @MartinLiversage:不正确。这行得通。 C# 中的数组一直是协变的。
猜你喜欢
  • 2014-12-28
  • 1970-01-01
  • 2013-06-30
  • 2022-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多