mic*_*ael 7 c# lambda delegates action
我有一个类,用户可以将Action传入(或不传递).
public class FooClass<T> : BaseClass<T>
{
public FooClass()
: this((o) => ()) //This doesn't work...
{
}
public FooClass(Action<T> myAction)
: base(myAction)
{
}
}
Run Code Online (Sandbox Code Playgroud)
Action.但是,与此同时,我不想强迫我的用户传入Action.相反,我希望能够动态创建"无所事事"动作.
jas*_*son 35
你想说
this(t => { })
Run Code Online (Sandbox Code Playgroud)
想想这样.你需要t => anonymous-expression-body.在这种情况下,anonymous-expression-body是一个expression或一个block.你不能有一个空的表达式,所以你不能指出一个空的方法体expression.因此,您必须使用a,block在这种情况下,您可以说{ }a表示a block为空statement-list,因此是空体.
有关详细信息,请参阅语法规范,附录B.
这是另一种思考它的方式,这是一种可以用来自己发现它的方法.An Action<T>是一个接收T并返回的方法void.您可以Action<T>通过非匿名方法或通过匿名方法定义.您正在尝试使用匿名方法(或者更确切地说,一个非常特殊的匿名方法,即lambda表达式)来弄清楚如何使用它.如果你想通过非匿名方法这样做,你会说
private void MyAction<T>(T t) { }
Run Code Online (Sandbox Code Playgroud)
然后你可以说
this(MyAction)
Run Code Online (Sandbox Code Playgroud)
它使用方法组的概念.但是现在你想把它翻译成lambda表达式.所以,让我们只使用该方法体并使其成为lambda表达式.因此,我们扔掉private void MyAction<T>(T t)并替换它t =>并逐字复制方法体{ }.
this(t => { })
Run Code Online (Sandbox Code Playgroud)
繁荣.
它不应该是大括号吗?
public FooClass()
: this(o => {})
{
}
Run Code Online (Sandbox Code Playgroud)
Lambda形式是 (/*paramaters*/) => {/*body*}
可以省略参数周围的括号,但只有当它是单个(非空)语句时,才能省略主体周围的Curly括号.
| 归档时间: |
|
| 查看次数: |
8979 次 |
| 最近记录: |