我有一个类,用户可以将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
。相反,我希望能够动态创建“无所事事”动作。
答案 0 :(得分:35)
你想说
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 => { })
动臂。
答案 1 :(得分:6)
不应该是大括号吗?
public FooClass()
: this(o => {})
{
}
Lambda表单为(/*paramaters*/) => {/*body*}
可以省略参数周围的括号,但只有当它是单个(非空)语句时,才能省略主体周围的Curly括号。