Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 命名参数是方法的一部分';谁的签名?如何以及为什么?_C#_Function_Syntax_Parameters_Arguments - Fatal编程技术网

C# 命名参数是方法的一部分';谁的签名?如何以及为什么?

C# 命名参数是方法的一部分';谁的签名?如何以及为什么?,c#,function,syntax,parameters,arguments,C#,Function,Syntax,Parameters,Arguments,我的意思是,命名参数在某种程度上似乎是一个签名:您不能使用任何名称调用命名方法,而只考虑参数的位置。但是,我们不能创建两个具有相同签名和名称但使用不同参数名称的方法 接口可以强制类的方法使用给定参数的名称吗 使用命名参数: int i=函数(名称为:x) 不使用命名参数: int i=函数(x) 就唯一性约束而言,参数名称不是签名的一部分 根据C#4规范第3.6节: 方法的签名由方法的名称、类型参数的数量以及每个形式参数的类型和种类(值、引用或输出)组成,按从左到右的顺序考虑。出于这些目的,在形

我的意思是,命名参数在某种程度上似乎是一个签名:您不能使用任何名称调用命名方法,而只考虑参数的位置。但是,我们不能创建两个具有相同签名和名称但使用不同参数名称的方法

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

使用命名参数:

int i=函数(名称为:x)

不使用命名参数:

int i=函数(x)


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

根据C#4规范第3.6节:

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

参数名是编译器“知道”方法的一部分;它是必须在元数据中传播的信息,因为它用于命名参数

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

不。事实上,您可能会导致一些非常混乱的代码:

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

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

根据C#4规范第3.6节:

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

参数名是编译器“知道”方法的一部分;它是必须在元数据中传播的信息,因为它用于命名参数

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

不。事实上,您可能会导致一些非常混乱的代码:

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

这个问题很令人困惑。我不太清楚你到底在问什么…对不起,我的英语很有限。我举了一些例子,这个问题很令人困惑。我不太清楚你到底在问什么…对不起,我的英语很有限。我举了一些例子。哦,天哪,你是乔恩·斯基特!我在读你的书。谢谢你的回答和它的例子。@Josell:破解-希望第15章(或任何一章)能有所帮助:)哦,我的上帝,你是Jon Skeet!我在读你的书。谢谢你的答案和它的例子。@Josell:Cracking-希望第15章(或任何一章)能有所帮助:)