我的意思是,命名参数在某种程度上似乎是一个签名:您不能使用任何名称调用命名方法,而只能尊重参数的位置。但是,我们不能创建具有相同签名和名称但使用不同参数名称的两个方法。
接口可以强制类的方法使用给定参数的名称吗?
使用命名参数:
int i = Function(NamedArgument: x);
不使用命名参数:
int i = 函数(x);
我的意思是,命名参数在某种程度上似乎是一个签名:您不能使用任何名称调用命名方法,而只能尊重参数的位置。但是,我们不能创建具有相同签名和名称但使用不同参数名称的两个方法。
接口可以强制类的方法使用给定参数的名称吗?
使用命名参数:
int i = Function(NamedArgument: x);
不使用命名参数:
int i = 函数(x);
就唯一性约束而言,参数名称不是签名的一部分,不。
从 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