C# 怪异数组.ConvertAll

C# 怪异数组.ConvertAll,c#,arrays,C#,Arrays,但是results数组的元素没有改变,ConvertAll()之后每个元素的文件名都是null,怎么了?array.ConvertAll返回一个新数组,它不会修改现有的数组。您没有将方法的返回分配给任何对象: [StructLayout(LayoutKind.Sequential)] public struct RecognizeResult { /// float public float similarity; /// ch

但是results数组的元素没有改变,ConvertAll()之后每个元素的文件名都是null,怎么了?

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) );

注意,这只是创建了一个空StringBuilder数组。。。但是这有点超出了问题的范围,因为你还没有说你想要完成什么。

如果
RecognizeResult
是一个类,那么它就可以工作了

它与返回值无关,可以安全地忽略返回值

问题是,
RecognizeResult
结构的副本被传递给转换器函数(顺便说一句,它返回一个
StringBuilder
)。因此,你没有改变你认为你正在改变的价值

要正确执行此操作,您需要使用数组:

var newArray = Array.ConvertAll(results, r => r.fileName = new StringBuilder(50));
for(int i=0;i
但它将返回一个字符串数组,并且仍然无法达到预期的效果…一个stringbuilder数组(oops):)如果答案错误(或者没有按照您的要求执行),您不应该接受答案。但它解释了原因。所以我接受了答案。不,这不能解释为什么。这种行为在这里是完全可以预料的。终于有时间提供了一个更好的答案:)我的答案没有错,它只是做了一些看起来毫无意义的事情,就像原始代码一样。
for (int i = 0; i < results.Length; i++)
{
  results[i].fileName = new StringBuilder(50);
}