2010-10-30 58 views
33

當我試圖在一個Action委託使用參數...我可以在Action或Func代表中使用參數嗎?

private Action<string, params object[]> WriteToLogCallBack; 

我收到這樣的設計時錯誤:

Invalid token 'params' in class, struct, or interface member declaration

任何幫助!

+1

params不是一種類型,即你可以在類型定義中使用'ref'? – 2010-10-30 17:09:42

回答

35

這種解決方法如何?

private Action<string, object[]> writeToLogCallBack; 
public void WriteToLogCallBack(string s, params object[] args) 
{ 
    if(writeToLogCallBack!=null) 
    writeToLogCallBack(s,args); 
} 

或者你可以定義自己的委託類型:

delegate void LogAction(string s, params object[] args); 
+0

你如何用lambda來稱呼它? – toddmo 2017-02-23 22:50:46

3

您可以在委託的實際聲明中使用params,但不是一個類型的。 Action的泛型參數只是類型,而不是調用委託時要傳遞的實際參數。 params不是一種類型,它是一個關鍵字。

9

C#中不可能使用變量類型參數。

例如,這就是爲什麼Action<...>Func<...>Tuple<...>有許多聲明的原因。不過,這將是一個有趣的功能。 C++ 0x has them

+0

不知道它會與泛型(與模板相對)有多好。 – CodesInChaos 2010-10-30 17:10:36

0

你可以試試這個。它允許任意數量的參數,並且如果傳遞了錯誤的數量或類型的參數,則會出現編譯時錯誤。

public delegate T ParamsAction<T>(params object[] oArgs); 

public static T LogAction<T>(string s, ParamsAction<T> oCallback) 
{ 
    Log(s); 
    T result = oCallback(); 
    return T; 
} 

Foo foo = LogAction<Foo>("Hello world.", aoArgs => GetFoo(1,"",'',1.1)); 
相關問題