2010-09-15 15 views
14

El siguiente bloque de código da como resultado el error: TargetParameterCountException no fue manejado por el código de usuario. No coinciden los parámetros.No coinciden los parámetros con 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], 
       } 
      ); 
     } 
    } 

¿Alguna idea?

+0

¿Cuál es la firma de 'AddListViewItem'? –

+0

Está justo allí. Él lo está llamando recursivamente. – BFree

+1

Asegúrese de aceptar la respuesta que resolvió su problema. – BFree

Respuesta

24

El error se produce debido a la covarianza de la matriz; una matriz de cadenas se puede asignar al object[]. Esto hace que el método Invoke trate cada elemento de la matriz string como si fuera un argumento para el método AddListViewItem.

Aquí hay una solución:

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

(o)

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

Esto hace que sea cristalina a Invoke que el método de destino toma un único parámetro.

+0

¡Perfecto! ¡Gracias! – sooprise

+0

@Ani, ¿podría explicar qué es la covarianza de matriz? mejor con un ejemplo. Gracias. – smwikipedia

+0

Gracias! Esto me estaba volviendo loco. Tu primer ejemplo funcionó bien en mi situación. Estaba pasando una matriz de objetos, pero el método de invocación no es lo suficientemente inteligente como para manejarlo tal como está. Ejemplo ... '.Invoke (mysource, new object [] {myobjectarray});' –

0

información de actualización:

Si está utilizando Windows Server 2008 R2, echar un vistazo a Windows Update Net Framework 4.5.1 para 2008 KB2858725 sistemas basadas en x64 de Windows Server R2. Para mí, una vez instalada, esta actualización solucionó este problema.

Cuestiones relacionadas