C#:在类实例化上创建一个do-nothing Action

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)


基本上,我不能将null传递给我的基类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)

繁荣.


Bro*_*ook 6

它不应该是大括号吗?

public FooClass()
        : this(o => {})
    {
    }
Run Code Online (Sandbox Code Playgroud)

Lambda形式是 (/*paramaters*/) => {/*body*}

可以省略参数周围的括号,但只有当它是单个(非空)语句时,才能省略主体周围的Curly括号.