【问题标题】:C#: create a do-nothing Action on class instantiation [duplicate]C#:在类实例化上创建一个无操作动作 [重复]
【发布时间】:2011-04-25 14:44:33
【问题描述】:
我有一个类,用户可以将 Action 传递给(或不传递给)。
public class FooClass<T> : BaseClass<T>
{
public FooClass()
: this((o) => ()) //This doesn't work...
{
}
public FooClass(Action<T> myAction)
: base(myAction)
{
}
}
基本上,我不能将 null 传递给
Action 的基类。但是,与此同时,我不想强迫我的用户传递
Action。相反,我希望能够即时创建“无所事事”动作。
【问题讨论】:
标签:
c#
delegates
action
lambda
【解决方案1】:
你想说
this(t => { })
这样想。你需要t => anonymous-expression-body。在这种情况下,anonymous-expression-body 是 expression 或 block。你不能有一个空的表达式,所以你不能用expression 来指示一个空的方法体。因此,您必须使用 block 在这种情况下,您可以说 { } 来表示 block 有一个空的 statement-list,因此是空的主体。
详见语法规范,附录B。
这是另一种思考方式,您可以用这种方式自己发现这一点。 Action<T> 是一个接受T 并返回void 的方法。您可以通过非匿名方法或匿名方法定义Action<T>。您正试图弄清楚如何使用匿名方法(或者更确切地说,一种非常特殊的匿名方法,即 lambda 表达式)来完成它。如果你想通过非匿名方法做到这一点,你会说
private void MyAction<T>(T t) { }
然后你可以说
this(MyAction)
它使用方法组的概念。但是现在您想将其转换为 lambda 表达式。所以,让我们把那个方法体变成一个 lambda 表达式。所以,我们把private void MyAction<T>(T t)扔掉,换成t =>,逐字复制方法体{ }。
this(t => { })
轰隆隆。
【解决方案2】:
不应该是大括号吗?
public FooClass()
: this(o => {})
{
}
Lambda 形式为(/*paramaters*/) => {/*body*}
参数周围的括号可以省略,但主体周围的花括号只有在它是单个(非空)语句时才能省略。