如何调用命名参数?

问题描述

重载的方法示例,用于命名参数调用

internal static dynamic TestMethod(params dynamic[] P1)
{
    //Sample Code
}

internal static dynamic TestMethod(dynamic P2,system.int32 P2a)
{
    //Sample Code Overload
}

如何为params参数使用命名参数?

public static void Main()
{
    TestMethod(1,2,3); //Works
    TestMethod(1,2); //Overload Conflict
    TestMethod(1,P2a: 2); //Overload Fix

    // How to call the named params parameter P1 of the first TestMethod?
    TestMethod(P1: /* ???? */ );
}

解决方法

这两个功能不兼容。您将必须自己构造数组,而不是让编译器为您这样做(总是以任何一种方式构造数组)。

我们怎么知道它们不兼容?来自Argument lists

带有 argument_name argument 被称为 命名参数 ,而 argument没有 argument_name 位置参数 。位置参数出现在 argument_list 中的命名参数之后。

请注意,最后一句话-命名参数后不能有位置参数。

Runtime evaluation of argument lists

方法,索引器和实例构造函数可以将其最右边的参数声明为参数数组

...

以扩展形式调用带有参数数组的函数成员时,调用必须为参数数组指定零个或多个位置参数 ...

(我的重点

也就是说,params功能仅适用于位置参数。