C# 为什么在将委托函数分配给委托变量时必须声明参数类型?

C# 为什么在将委托函数分配给委托变量时必须声明参数类型?,c#,types,delegates,C#,Types,Delegates,假设我有一个这样的代表 namespace somedelegatesb1 { class Program { delegate int Abc(int a); static void Main(string[] args) { Abc abc = delegate(int e) { return 0; }; } } } 为什么我必须在这里写

假设我有一个这样的代表

namespace somedelegatesb1  {
    class Program  {
        delegate int Abc(int a);
        static void Main(string[] args)  {
            Abc abc = delegate(int e) {  
              return 0; 
            };
        }

    }
}
为什么我必须在这里写参数int e

Abc abc = delegate(int e) {  
                  return 0; 
                };
为什么我不能写

Abc abc = delegate(e) {  
                  return 0; 
          };
它不会编译,但它不是“明显”是INTE吗?还会是什么?它不可能是除int e以外的任何东西,因为委托需要int e

假设我没有使用一个参数,也就是说,函数将接受一个参数,但表示它不会使用变量。那就毫无意义了。为什么我不能写

Abc abc = delegate {  
                  return 0; 
          };
即使我使用了一个参数。。变量名不一定是相关的,例如在javascript中,您可以说参数[0]。那么为什么不允许
Abc=delegate{…}


我知道C#是严格类型的,但我不建议在委托后编写类型时更改类型。我并不是建议c#允许传递比已经定义的更多或更少的参数。写这个字是多余的。即使在某些情况下变量名也是不必要的,例如,如果不使用它,尽管人们通常会使用它,因此我可以理解为什么他们可能会强制使用它,但这里的类型肯定是绝对不必要和毫无意义的。那么为什么C#似乎需要它呢?

因为匿名方法的语言规范说必须这样做。这是无可争辩的。使用lambda表达式代替。C#中的类型推断非常愚蠢(正如您所注意到的)-如果您想要更好的东西,请使用F#)(这只是开始-但在.net ATM上是结束)@HansPassant a lambda是一种匿名方法(它只是得到了C#中的特殊处理/语法-如果您不想详细指定您的参数,您可以使用它,也可以不声明类型(大多数时候))。。。请改用lambda。最后一个示例实际上是法律代码:
Abc=delegate{return 0;}(C#6.0)