【问题标题】: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 =&gt; anonymous-expression-body。在这种情况下,anonymous-expression-bodyexpressionblock。你不能有一个空的表达式,所以你不能用expression 来指示一个空的方法体。因此,您必须使用 block 在这种情况下,您可以说 { } 来表示 block 有一个空的 statement-list,因此是空的主体。

    详见语法规范,附录B。

    这是另一种思考方式,您可以用这种方式自己发现这一点。 Action&lt;T&gt; 是一个接受T 并返回void 的方法。您可以通过非匿名方法或匿名方法定义Action&lt;T&gt;。您正试图弄清楚如何使用匿名方法(或者更确切地说,一种非常特殊的匿名方法,即 lambda 表达式)来完成它。如果你想通过非匿名方法做到这一点,你会说

    private void MyAction<T>(T t) { }
    

    然后你可以说

    this(MyAction)
    

    它使用方法组的概念。但是现在您想将其转换为 lambda 表达式。所以,让我们把那个方法体变成一个 lambda 表达式。所以,我们把private void MyAction&lt;T&gt;(T t)扔掉,换成t =&gt;,逐字复制方法体{ }

    this(t => { })
    

    轰隆隆。

    【讨论】:

      【解决方案2】:

      不应该是大括号吗?

      public FooClass()
              : this(o => {})
          {
          }
      

      Lambda 形式为(/*paramaters*/) =&gt; {/*body*}

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

      【讨论】:

        猜你喜欢
        • 2021-07-31
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        • 1970-01-01
        • 2017-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多