2011-04-25 54 views
7

我有一個類,用戶可以傳遞一個行爲(或不)。C#:創建一個什麼也不做的類實例化操作

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

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


基本上,我不能爲空進入了 Action我的基類。但是,同時我不想強迫我的用戶通過 Action。相反,我希望能夠即時創建「無所事事」行爲。

回答

32

你想說

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 => { }) 

繁榮。

6

不應該是大括號嗎?

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

LAMBDA形式是可以省略圍繞參數(/*paramaters*/) => {/*body*}

括號,但身體周圍的大括號只有當它是一個單一的(非空)語句被省略。

相關問題