C#迭代器中ref局部变量报CS8176,是否等价于自定义辅助函数取值?
结论:两者完全不等同
原反编译代码中的ref Vector3 reference4 = ref vertices[vertexIndex + 3];是获取数组元素的托管引用,后续对reference4的赋值会直接修改vertices数组对应位置的原始值,这也是原代码修改网格顶点数据的核心逻辑。
而你实现的getElement方法返回的是Vector3的值拷贝,后续对reference3的修改只会作用于栈上的临时副本,不会改动原数组里的顶点数据,完全达不到原代码的功能效果。
报错原因
你遇到的CS8176错误是C#的语法限制:迭代器方法(包括Unity中返回IEnumerator的协程方法)会被编译器编译为状态机类,所有跨yield点的局部变量都会被提升为状态机的类字段,而ref局部变量属于托管指针,不允许作为类字段存在,因此编译器直接禁止在迭代器内声明ref局部变量。
正确修复方案
原代码用ref局部变量完全是冗余操作,你直接把4段ref相关的代码删掉,改成直接对数组元素赋值即可,功能和原代码完全一致,也不会触发报错:
// 删掉原来的ref声明和赋值,替换为下面4行 vertices[vertexIndex] = matrix.MultiplyPoint3x4(vertices[vertexIndex]); vertices[vertexIndex + 1] = matrix.MultiplyPoint3x4(vertices[vertexIndex + 1]); vertices[vertexIndex + 2] = matrix.MultiplyPoint3x4(vertices[vertexIndex + 2]); vertices[vertexIndex + 3] = matrix.MultiplyPoint3x4(vertices[vertexIndex + 3]);
内容的提问来源于stack exchange,提问作者Irbis77
相关产品推荐
相关产品推荐

