0 votes

Sourd Array.ConvertAll

[StructLayout(LayoutKind.Sequential)]
    public struct RecognizeResult
    {

        /// float
        public float similarity;

        /// char*
        [MarshalAs(UnmanagedType.LPStr)]
        public StringBuilder fileName;

    }

RecognizeResult[] results = new RecognizeResult[50];

Array.ConvertAll(results, r => r.fileName = new StringBuilder(50) );

Mais l'élément du tableau de résultats n'est pas modifié, le fileName de chaque élément est nul après le ConvertAll(), qu'est-ce qui ne va pas?

1voto

leppie Points 67289

Si RecognizeResult était une classe, alors cela fonctionnerait.

Cela n'a rien à voir avec la valeur de retour, qui peut être ignorée en toute sécurité.

Le problème est qu'une copie de la structure RecognizeResult est passée à la fonction de conversion (qui renvoie incidentellement un StringBuilder). Par conséquent, vous ne mutez pas la valeur que vous pensez changer.

Pour faire cela correctement, vous auriez besoin d'utiliser un tableau :

for (int i = 0; i < results.Length; i++)
{
  results[i].fileName = new StringBuilder(50);
}

0voto

Rex M Points 80372

Array.ConvertAll renvoie un nouveau tableau, il ne modifie pas celui existant. Vous n'assignez pas le retour de la méthode à quoi que ce soit :

var newArray = Array.ConvertAll(results, r => r.fileName = new StringBuilder(50));

Notez que cela crée simplement un tableau de StringBuilders vides... mais cela sort un peu du cadre de la question car vous n'avez pas précisé ce que vous essayez d'accomplir.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X