[英]Unity particleSystem main access cannot modify struct member when accessed struct is not classified as a variable
我有以下代码来修改 Unity 中ParticleSystem
的属性
waterCone.main.loop = true;
但是,这给了我以下错误
属性“主”访问返回临时值。 访问的结构未分类为变量时无法修改结构成员
Unity自己的文档似乎显示此代码的使用如下
var waterConeMain = waterCone.main;
waterConeMain.loop = true;
完全没有错误。
为什么这样可以解决问题,就我对c#的理解而言,这应该是完全一样的。
事实上,据我所知,两者都不应该工作。
我试图在 Sharplab 中比较这两者,但第一个甚至无法编译。
这里发生了什么? 为什么这个变量是必要的?
(编辑)
通过查看源代码,看起来ParticleSystem.main
正在这样做
MainModule main => new MainModule(this);
Main 是一个结构,它具有循环作为属性,例如
get => ParticleSystem.MainModule.get_loop_Injected(ref this);
set => ParticleSystem.MainModule.set_loop_Injected(ref this, value);
但实际上这似乎给我留下了比答案更多的问题,为什么当我不使用临时变量时这是一个编译错误?
ParticleSystem.main
的返回类型是 struct 类型,不能直接修改它的值。 不能这样做的主要原因是返回的struct值只是一个副本,所以这个时候修改值通常是没有意义的,会导致一些难以察觉的错误。 引用官方文档的解释
发生此错误是因为在赋值时复制了值类型。 当您从属性或索引器中检索值类型时,您将获得对象的副本,而不是对对象本身的引用。 返回的副本不由属性或索引器存储,因为它们实际上是方法,而不是存储位置(变量)。 您必须将副本存储到您声明的变量中,然后才能对其进行修改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.