什么允许匿名无参数委托类型不同?

时间:2013-02-13 08:20:54

标签: c# delegates lambda anonymous-types anonymous-methods

阅读article "Anonymous Methods"(作为文章系列“C#3.0中的代表和Lambda表达式”的一部分)中的短语:

  • 高级主题:无参数匿名方法

    ...允许匿名方法省略参数列表(例如delegate { return Console.ReadLine() != ""})。这是非典型的,但允许相同的匿名方法出现在多个方案中,即使委托类型可能有所不同“*

我变得有点困惑。

IMO(现在找不到,但据我记得),类型由参数列表确定,但不是由方法的返回类型确定。这是对的吗?

那么,无参数方法或委托的类型如何不同?

任何(最简单的)代码示例说明了相同匿名方法的不同无参数委托类型,我们将不胜感激。

1 个答案:

答案 0 :(得分:5)

参数列表允许不同。但是使用匿名方法,完全省略参数列表是合法的。编译器将知道参数列表必须是什么样的,因此不需要编写它。当然,如果您要使用参数(通常是您的参数),那么您必须指定并命名它们。

我认为这说明了:

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表达式语法在这方面略有不同。她永远不会省略参数。但在许多情况下,您可以省略参数的类型。如果只有一个参数,并且省略了它的类型,那么你也可以省略括号。