命名参数是方法签名的一部分吗?如何以及为何?

Jos*_*ell 0 c# parameters syntax arguments function

我的意思是,命名参数似乎是某种方式的签名:您不能使用任何名称并且仅尊重参数的位置来调用命名方法。但是,我们不能创建两个具有相同签名和名称但使用不同参数名称的方法。

接口可以强制类的方法使用给定参数的名称吗?

使用命名参数:

int i = Function(NamedArgument: x);

不使用命名参数:

int i = 函数(x);

Jon*_*eet 5

就唯一性约束而言,参数名称不是签名的一部分,不是。

来自 C# 4 规范第 3.6 节:

方法的签名由方法的名称、类型参数的数量以及每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑。出于这些目的,出现在形式参数类型中的方法的任何类型参数不是通过其名称来标识,而是通过其在方法的类型参数列表中的序号位置来标识。具体来说,方法的签名不包括返回类型、可能为最右边的参数指定的 params 修饰符,也不包括可选的类型参数约束。

不过,参数名称编译器“了解”该方法的一部分;它是必须在元数据中传播的信息因为它用于命名参数。

接口可以强制类的方法使用给定参数的名称吗?

不。事实上,你可能会导致一些非常令人困惑的代码:

interface IFoo
{
    public int M(int x, int y);
}

public class Foo : IFoo
{
    public int M(int y, int x)
    {
        return x - y;
    }
}

...

Foo foo = new Foo();
IFoo ifoo = foo;
Console.WriteLine(foo.M(x: 10, y: 3)); // Prints 7
Console.WriteLine(ifoo.M(x: 10, y: 3)); // Prints -7
Run Code Online (Sandbox Code Playgroud)