[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) );
但是结果数组的元素没有改变,每个元素的fileName在ConvertAll()之后为null,有什么不对?
答案 0 :(得分:1)
如果RecognizeResult
是一个类,那么它会起作用。
它与返回值无关,可以安全地忽略它。
问题是RecognizeResult
结构的副本被传递给转换器函数(偶然返回StringBuilder
)。因此,您不会改变您认为正在改变的价值。
要正确执行此操作,您需要使用数组:
for (int i = 0; i < results.Length; i++)
{
results[i].fileName = new StringBuilder(50);
}
答案 1 :(得分:0)
Array.ConvertAll返回一个新数组,它不会修改现有数组。您没有将方法的返回值分配给任何内容:
var newArray = Array.ConvertAll(results, r => r.fileName = new StringBuilder(50));
请注意,这只是创建一个空StringBuilders的数组......但是这有点超出了问题的范围,因为你还没有说出你想要完成的任务。