2010-09-15 15 views
14

Poniższy blok kodu powoduje błąd: nie powiodło się wykonanie polecenia TargetParameterCountException według kodu użytkownika. Niezgodność liczby parametrów.Niezgodność liczby parametrów z Invoke?

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], 
       } 
      ); 
     } 
    } 

Jakieś pomysły?

+0

Jaki jest podpis 'AddListViewItem'? –

+0

Jest tam. On nazywa to rekursywnie. – BFree

+1

Upewnij się, że akceptujesz odpowiedź, która rozwiązała Twój problem. – BFree

Odpowiedz

24

Błąd występuje z powodu kowariancji macierzy; tablica ciągów jest przypisywana do object[]. To powoduje, że metoda Invoke traktuje każdy element tablicy string tak, jakby był argumentem dla metody AddListViewItem.

Oto dylemat:

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

(lub)

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

To sprawia, że ​​krystalicznie jasne Invoke że metoda cel przyjmuje jeden parametr .

+0

Idealny! Dzięki! – sooprise

+0

@Ani, Czy możesz wyjaśnić, co to jest kowariancja tablic? lepiej z przykładem. Dzięki. – smwikipedia

+0

Dzięki! To doprowadzało mnie do szału. Twój pierwszy przykład zadziałał dobrze w mojej sytuacji. Przekazywałem tablicę obiektów, ale metoda invoke nie jest wystarczająco inteligentna, aby obsłużyć ją w takim stanie. Przykład ... '.Invoke (mysource, nowy obiekt [] {myobjectarray});' –

0

informacje UPDATE:

Jeśli używasz Windows Server 2008 R2, spojrzeć na Windows Update dla .Net Framework 4.5.1 dla systemów Windows Server 2008 R2 x64 KB2858725. Dla mnie po zainstalowaniu tej aktualizacji naprawiono ten problem.

Powiązane problemy