2010-10-30 6 views
33

Wenn ich versuche params in einem Action-Delegaten zu verwenden ...Kann ich Params in Action- oder Func-Delegaten verwenden?

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

ich diesen Entwurf Zeitfehler erhalten:

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

Jede Hilfe!

+1

Parameter ist kein Typ, d. H. Sie können 'ref' in Typdefinition verwenden? –

Antwort

35

Wie wäre es mit dieser Problemumgehung?

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

Oder Sie könnten Ihre eigenen Delegattyp definieren:

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

Wie nennt man das mit einem Lambda? – toddmo

3

Sie params in der eigentlichen Erklärung eines Delegierten verwenden können, aber nicht in der Art von einem. Die generischen Parameter für eine Aktion sind nur Typen, nicht die tatsächlichen Argumente, die beim Aufrufen des Delegaten übergeben werden. params ist kein Typ, es ist ein Schlüsselwort.

9

Parameter des Variadic-Typs sind in C# nicht möglich.

Deshalb gibt es zum Beispiel viele Deklarationen für Action<...>, Func<...> und Tuple<...>. Es wäre jedoch ein interessantes Feature. C++ 0x has them.

+0

Nicht sicher, wie gut es mit Generika (im Gegensatz zu Vorlagen) funktionieren würde. – CodesInChaos

0

Sie könnten dies versuchen. Es ermöglicht eine beliebige Anzahl von Argumenten und Sie erhalten einen Fehler bei der Kompilierung, wenn Sie die falsche Anzahl oder Art von Argumenten übergeben.

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));