参数列表不允许不同。但是对于匿名方法,完全省略参数列表是合法的。编译器将知道参数列表必须是什么样子,因此无需编写它。当然,如果您要使用参数(通常是这样),那么您必须指定并命名它们。
我认为这说明了:
internal delegate void NoParameters();
internal delegate void SomeParametersThatYouMightNotUse(int i, ref string s, Uri uri);
那么以下是合法的:
NoParameters f = delegate { Console.WriteLine("Hello"); };
SomeParametersThatYouMightNotUse g = delegate { Console.WriteLine("Hello"); };
( ... )
注意,关键字后面没有括号delegate
。
但是,如果您在括号中指定参数,那么它们当然必须与类型匹配:
NoParameters f = delegate() { Console.WriteLine("Hello"); };
SomeParametersThatYouMightNotUse g = delegate(int i, ref string s, Uri uri) { Console.WriteLine("Hello"); };
在所有情况下,当您调用委托时,请使用正确的参数:
f();
string myString = "Cool";
g(42, ref myString, new Uri("http://stackoverflow.com/"));
Lambda 表达式语法在这方面略有不同。她永远不能省略参数。但是在很多情况下你可以省略参数的类型。如果只有一个参数,而你省略了它的类型,那么你也可以省略括号。