2011-04-25 12 views
7

私は、ユーザーがActionを渡すことができるクラスを持っています。C#:クラスインスタンス化で何もしないアクションを作成する

public class FooClass<T> : BaseClass<T> 
{ 
    public FooClass() 
     : this((o) =>()) //This doesn't work... 
    { 
    } 

    public FooClass(Action<T> myAction) 
     : base(myAction) 
    { 
    } 
} 


基本的に、私は Actionのための私の基本クラスにnullを渡すことはできません。しかし同時に、私はユーザーに Actionを渡すよう強制したくありません。代わりに、私はその場で「何もしない」アクションを作成できるようにしたいと考えています。

答えて

32

あなたはこのようなことの

this(t => { }) 

考えると言いたいです。 t => anonymous-expression-bodyが必要です。この場合、anonymous-expression-bodyexpressionまたはblockです。空の式を持つことはできないので、expressionの空のメソッド本体を示すことはできません。したがって、blockを使用する必要があります。その場合は、blockに空のstatement-listがあることを示すために{ }と言うことができ、したがって空の本体です。詳細について

、文法仕様を参照して、付録B.

そして、ここでは、あなた自身のためにこれを発見するために使用できる方法である、それを考えるための別の方法です。 Action<T>は、Tを取り込み、voidを返すメソッドです。 Action<T>は、非匿名メソッドまたは匿名メソッドを使用して定義できます。あなたは、匿名メソッド(またはむしろ、非常に特殊な匿名メソッド、つまりラムダ式)を使用してそれを行う方法を理解しようとしています。あなたは非匿名メソッドを介してこれをやってみたかった場合は、

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

を言うと、あなたは、メソッド・グループの概念を使用し

this(MyAction) 

を言うことができます。しかし今、これをラムダ式に変換したいと思っています。だから、そのメソッドの本体を取り、それをラムダ式にしましょう。したがって、private void MyAction<T>(T t)を捨ててt =>に置き換え、メソッド本体{ }をそのままコピーします。

this(t => { }) 

ブーム。

6

中括弧にする必要はありませんか?

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

ラムダフォームパラメータの周り(/*paramaters*/) => {/*body*}

括弧を省略することができますが、体の周りの中括弧は、それが単一の(空ではない)文の場合にのみ、省略することができます。

関連する問題