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

时间:2011-04-25 14:44:34

标签: c# delegates action lambda

我有一个类,用户可以将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。相反,我希望能够动态创建“无所事事”动作。

2 个答案:

答案 0 :(得分:35)

你想说

this(t => { })

这样想。您需要t => anonymous-expression-body。在这种情况下,anonymous-expression-bodyexpressionblock。您不能使用空表达式,因此无法使用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括号。