2012-12-10 51 views
12

我希望能夠做到以下幾點:將缺省值的方法賦值給沒有這些參數的Func <>?

Func<int,bool> tryMethodFunc = TryMethod; 

凡TryMethod具有類似特徵:

bool TryMethod(int value, int value2 = 0, double value3 = 100.0) 

我不反對以破法成一個咖喱格式,但如果沒有辦法做到這一點,將會有更多的工作。

+5

只是所以我明白了,有'Func tryMethodFunc =>(value)=> TryMethod(value)'是不夠的嗎? –

+1

嗯,這的確行得通。作爲答案,我會標記它 – Firestrand

+1

隨意標記KeYan的答案;它非常全面,包含我的解決方法。 –

回答

8

可選參數是一種語言功能,編譯器負責將調用轉換爲具有可選參數的方法,以完全調用值。

看這一段簡單的代碼如下,

public void GeneralMethod() 
    { 
     TestMethod(6); 
    } 

    public bool TestMethod(int a, int b = 8) 
    { 
     return true; 
    } 

當你拆開這些方法,你會看到,C#編譯器實際上取代了調用TestMethod的一個參數與兩個參數調用。從反彙編的屏幕截圖證明,

ildasm screen shot

現在,來到目前的問題,代碼有問題的行試圖將一個函數功能結合使用具有可選參數的方法。如果C#編譯器必須處理這個,它必須確保Func有一些知道默認值。雖然這可能已經由編譯器實現了,但它完全破壞了Func的目的。

Func 的目的是提供一種以廣義和簡單的方式存儲匿名方法的方法。reference

在計算器另一個類似的問題,可以發現here

@克里斯·辛克萊的解決方案解決了這個問題通過創建一個參數,並從該匿名方法體調用TryMethod匿名方法。