Unity粒子系统主访问无法修改结构成员,当访问的结构未被分类为变量时。

3

我有以下代码来修改Unity中ParticleSystem的属性:

waterCone.main.loop = true;

然而,这里出现了以下错误:
“属性'main'访问返回临时值。在访问的结构不被归类为变量时,无法修改结构成员。”
看起来Unity官方文档展示该代码应该如下使用:
var waterConeMain = waterCone.main;
waterConeMain.loop = true;

完全没有错误。

根据我对C#的理解,为什么这样修复问题呢?这应该是完全相同的。

事实上,据我所知,两者都不应该起作用。

我试图在Sharplab中比较这两个,但第一个甚至无法编译。

这里发生了什么?为什么需要这个变量?


(编辑)

从查看源代码来看,似乎ParticleSystem.main正在执行此操作。

MainModule main => new MainModule(this);

主要是一个结构体,它有一个名为“loop”的属性,例如

get => ParticleSystem.MainModule.get_loop_Injected(ref this);
set => ParticleSystem.MainModule.set_loop_Injected(ref this, value);

但事实上,这似乎给我留下了更多的问题,为什么在没有使用临时变量的情况下,这是一个编译错误

1个回答

1

ParticleSystem.main 的返回类型是一个结构体类型,你不能直接修改它的值。你不能这样做的主要原因是返回的结构体值只是一个副本,所以在这个时候修改值通常是没有意义的,并且会导致一些难以察觉的错误。引用自官方文档的解释。

这个错误发生的原因是值类型在赋值时被复制了。当你从属性或索引器中检索值类型时,你得到的是对象的一个副本,而不是对象本身的引用。返回的副本并没有被属性或索引器存储,因为它们实际上是方法,而不是存储位置(变量)。你必须将副本存储到一个你声明的变量中才能修改它。


这似乎有点过分,将其作为一个“错误”而不是一个警告...但也可以理解。毕竟,在返回值类型上调用具有副作用的某个函数并不那么罕见:/ - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接