2010-09-15 5 views
14

Der folgende Codeblock führt zu dem Fehler: TargetParameterCountException wurde von Benutzercode nicht behandelt. Parameteranzahl stimmt nicht überein.Parameteranzahl stimmt nicht mit Invoke überein?

public void AddListViewItem(string[] Data) 
    { 
     if (InvokeRequired) 
     { 
      Invoke(new Action<string[]>(AddListViewItem), Data); 
     } 
     else 
     { 
      ListViewData.Items.Add(Data[0]).SubItems.AddRange 
      (
       new string[] 
       { 
        Data[1], 
        Data[2], 
        Data[3], 
       } 
      ); 
     } 
    } 

Irgendwelche Ideen?

+0

Was ist die Signatur von 'AddListViewItem'? –

+0

Es ist genau dort. Er nennt es rekursiv. – BFree

+1

Achten Sie darauf, die Antwort zu akzeptieren, die Ihr Problem gelöst hat. – BFree

Antwort

24

Der Fehler tritt wegen Array-Kovarianz auf; Ein Array von Strings ist object[] zuweisbar. Dies bewirkt, dass die Invoke-Methode jedes Element des string-Arrays behandelt, als ob es ein Argument für die AddListViewItem-Methode wäre.

Hier ist ein fix:

Invoke(new Action<string[]>(AddListViewItem), new object[] {Data}); 

(oder)

Invoke(new Action<string[]>(AddListViewItem), (object)Data); 

Dies macht es kristallklar zu Invoke, dass die Zielmethode ein einzelnen Parameter übernimmt.

+0

Perfekt! Vielen Dank! – sooprise

+0

@Ani, Könnten Sie erklären, was Array-Kovarianz ist? besser mit einem Beispiel. Vielen Dank. – smwikipedia

+0

Danke! Das hat mich verrückt gemacht. Dein erstes Beispiel hat in meiner Situation gut funktioniert. Ich habe ein Objektarray übergeben, aber die Methode zum Aufrufen ist nicht intelligent genug, um sie so zu behandeln, wie sie ist. Beispiel ... '.Invoke (mysource, neues Objekt [] {myobjectarray});' –

0

UPDATE Informationen:

Wenn Sie mit Windows Server 2008 R2, werfen Sie einen Blick auf Windows Update für .Net Framework 4.5.1 für Windows Server 2008 R2 x64-basierte Systeme KB2858725. Für mich, nach der Installation dieses Update behoben dieses Problem.