2014-09-05 3 views
5

Ich habe eine Funktion dieser ArtEin Delegierter für eine Funktion mit variablen Parametern

void func(params object[] parameters) { 
    //Function Body 
} 

Es Parameter der folgenden akzeptieren sortieren

func(10, "hello", 30.0); 
func(10,20); 

und so weiter.

Ich wollte einen Action Delegaten für die obige Funktion erstellen. Ist es möglich? Wenn nicht, warum?

+0

Nein, komischerweise das war vor einer halben Stunde diskutiert! http://StackOverflow.com/a/25689676/1663001 – DavidG

+1

http://StackOverflow.com/Questions/4059624/can-i-use-Params-in-Action-Funktionen –

Antwort

8

Sie können die bestehenden Action Delegierten mit params verwenden, aber Sie können Ihre eigenen Delegierten auf diese Weise erklären:

public delegate void ParamsAction(params object[] arguments) 

Dann:

// Note that this doesn't have to have params, but it can do 
public void Foo(object[] args) 
{ 
    // Whatever 
} 

... 

ParamsAction action = Foo; 
action("a", 10, 20, "b"); 

Natürlich Sie können ein erstellen Action<object[]> für Ihre bestehende Methode - aber Sie verlieren den params Aspekt davon, wie das in Action<T> nicht erklärt wird. So zum Beispiel:

public static void Foo(params object[] x) 
{ 
} 

... 

Action<object[]> func = Foo; 
func("a", 10, 20, "b"); // Invalid 
func(new object[] { "a", 10, 20, "b" }); // Valid 

Also, wenn du bist der Delegierte aus dem Code aufrufen, die params nutzen will, müssen Sie eine Art delegieren, die das (nach dem ersten Teil) enthält in der Erklärung. Wenn Sie nur einen Delegaten erstellen möchten, der eine object[] akzeptiert, dann können Sie eine Instanz von Action<object[]> mit einer Methode erstellen, die params in seiner Signatur hat - es ist nur ein Modifikator, effektiv.

-1

Hier stoßen Sie gegen die Einschränkungen der funktionalen Programmierung in C#: Sie können keinen Delegaten mit einer variablen Anzahl von generisch typisierten Parametern haben (die Action Delegierten haben eine feste Anzahl generischer Parameter). Aber Sie können es nützlich finden für jede Anzahl von Parametern generic Überlastungen zu schaffen:

void func<T1>(T1 parameter1) { ... } 
void func<T1,T2>(T1 parameter1, T2 parameter2) { ... } 
void func<T1,T2,T3>(T1 parameter1, T2 parameter2, T3 parameter3) { ... } 

Was Sie gewinnt die Fähigkeit, diese Funktionen als Parameter übergeben werden (dh sie passieren einfach ohne Lambda-Ausdrücke zu verwenden). Wenn Sie also eine Funktion wie diese haben:

void anotherFunc(Action<string, int> parameter) { ... } 

Dann können Sie es so nennen:

anotherFunc(func); 
+0

'Sie können nicht haben delegiere mit einer variablen Anzahl von Parametern. Sicher kannst du. – Servy

+0

@Servy Recht, Sie können, aber Sie können nicht einen der "Action" Delegierten verwenden. – McGarnagle

+0

Das stimmt, aber das ist nicht das, was Sie in Ihrer Antwort gesagt haben. Sie sagten, dass Sie keinen Delegaten mit einer variablen Anzahl von Parametern haben können, nicht dass Sie keine "Aktion" mit einer variablen Anzahl von Parametern haben können. – Servy

Verwandte Themen