C# 为什么在声明委托时需要标识符?

C# 为什么在声明委托时需要标识符?,c#,C#,当我们在C#中创建委托以指向具有明确签名(参数集)的函数时,它要求我们也为每种类型指定标识符 public delegate void myDelegate(int x, int y); 如果我尝试将此原型声明编写为: public delegate void myDelegate(int, int) 它显示一个编译时错误,表示预期标识符 但我认为,当我们只是为方法指定原型时,为什么编译器需要一个标识符来区分具有不同签名的两个方法: public delegate void firstD

当我们在C#中创建委托以指向具有明确签名(参数集)的函数时,它要求我们也为每种类型指定标识符

public delegate void myDelegate(int x, int y);  
如果我尝试将此原型声明编写为:

public delegate void myDelegate(int, int)
它显示一个编译时错误,表示
预期标识符

但我认为,当我们只是为方法指定原型时,为什么编译器需要一个标识符来区分具有不同签名的两个方法:

public delegate void firstDelegate(int);

是区分它们的充分和明确的声明。我想是的


我想你们已经明白我的意思了???

这可以在调用点上产生影响。例如:

using System;

class Test
{
    delegate void Foo(int x, int y);

    static void Main()
    {
        Foo foo = (x, y) => Console.WriteLine("x={0}, y={1}", x, y);
        foo(x: 5, y: 10);
        foo(y: 10, x: 5);
    }
}
两行的输出都是
x=5,y=10
,因为参数使用名称而不是位置。即使C#在C#4中只获得命名参数

现在当然不必这样了。它本来可以设计为使委托一开始就没有命名参数——但是当您调用的所有其他对象都有命名参数时,为什么要使委托与众不同呢

顺便问一下,你会为接口方法和抽象方法提出同样的建议吗?同样,声明中没有直接使用参数,因为它们只是签名


请注意,参数名称有助于提高可读性,并使参数更易于记录。

不要“定义委托”。使用
System.Action
。不要试图重新发明轮子。我真的不喜欢这样说,但是“因为语言就是这样”如果我不得不猜测的话,我会说这是为了让intellisense可以在你将数据和变量名传递到计算机时提供有用的数据和变量名delegate@HighCore你希望每个人都使用最新的.NET版本,但是对于没有
System.Action
@jonathanlonowski的旧版本,可能仍然值得回答,然后升级.Net版本。这不是java。我个人认为,例如<代码>委托NetEventHandler(Socket Socket,NETEngEvin事件)比“代码>系统”要可读得多。Action < /C> > + 1…请注意,样本在历史上并不一致:)。。问题本质上是为什么.Net 1.0(2002+)要求为委托的参数命名,并且您展示了在编写Lambda表达式(2008+)和使用命名参数(2010+)@AlexeiLevenkov时它是如何有用的:不要将框架与C语言混淆。我知道VB早在C#之前就有可选参数了——如果它也有命名参数,我也不会感到惊讶,尽管我还没有验证过这一点。即使没有,其他语言也可以做到。参数有名称这一事实意味着它们可以被使用,即使不是在C#中。事实上,你的评论可以更好地回答:)-事实上VB.Net早就支持了-所以在C#能够使用它们之前,代理上的名称就需要了。@AlexeiLevenkov:将添加这一点。我没有找到推荐人,所以不想认领。作为一个迂腐的观点,你的意思是命名参数-所有参数都命名为。。。(不幸的是,Microsoft文档经常错误地使用这个术语。)
using System;

class Test
{
    delegate void Foo(int x, int y);

    static void Main()
    {
        Foo foo = (x, y) => Console.WriteLine("x={0}, y={1}", x, y);
        foo(x: 5, y: 10);
        foo(y: 10, x: 5);
    }
}