Ful*_*oof 4 c# lambda delegates anonymous-methods anonymous-types
阅读文章"匿名方法"(作为文章系列"C#3.0中的代理和Lambda表达式"的一部分)中的短语:
" 高级主题:无参数匿名方法
...允许匿名方法省略参数列表(delegate { return Console.ReadLine() != ""}例如).这是非典型的,但它确实允许相同的匿名方法出现在多个场景中,即使委托类型可能会有所不同 "*
我变得有点困惑.
IMO(现在找不到但据我记得),类型由参数列表确定,但不是由方法的返回类型确定.这是对的吗?
那么,无参数方法或委托的类型如何不同?
任何(最简单的)代码示例说明了相同的匿名方法的不同无参数委托类型将是值得赞赏的.
参数列表是不容许不同.但是使用匿名方法,完全省略参数列表是合法的.编译器将知道参数列表必须是什么样的,因此不需要编写它.当然,如果要使用参数(通常是这些参数),则必须指定并命名它们.
我认为这说明:
internal delegate void NoParameters();
internal delegate void SomeParametersThatYouMightNotUse(int i, ref string s, Uri uri);
Run Code Online (Sandbox Code Playgroud)
那么以下是合法的:
NoParameters f = delegate { Console.WriteLine("Hello"); };
SomeParametersThatYouMightNotUse g = delegate { Console.WriteLine("Hello"); };
Run Code Online (Sandbox Code Playgroud)
注意,( ... )关键字后没有括号delegate.
但是,如果在括号中指定参数,则它们必须与类型匹配:
NoParameters f = delegate() { Console.WriteLine("Hello"); };
SomeParametersThatYouMightNotUse g = delegate(int i, ref string s, Uri uri) { Console.WriteLine("Hello"); };
Run Code Online (Sandbox Code Playgroud)
在所有情况下,当您调用委托时,请使用正确的参数:
f();
string myString = "Cool";
g(42, ref myString, new Uri("http://stackoverflow.com/"));
Run Code Online (Sandbox Code Playgroud)
Lambda表达式语法在这方面略有不同.她永远不会省略参数.但在许多情况下,您可以省略参数的类型.如果只有一个参数,并且省略了它的类型,那么您也可以省略括号.
| 归档时间: |
|
| 查看次数: |
541 次 |
| 最近记录: |