C#中接口Getter/Setter报错:无法修改返回值的解决方法
解决“Cannot modify the return value because it is not a variable”错误
错误原因
你的代码里Vector2是值类型(struct),当你通过_scene.SceneItems[0].PositionCords获取坐标时,返回的是该值类型的副本。修改这个副本的X属性不会对原对象产生任何影响,编译器直接阻止了这种无效操作,因此抛出该错误。
解决方法
以下是几种可行的解决方案,可根据项目需求选择:
方案1:重新赋值整个Vector2对象
不要直接修改值类型的单个属性,而是创建新的Vector2实例,替换原有的PositionCords属性:
// 获取当前坐标的副本 var currentCoords = _scene.SceneItems[0].PositionCords; // 创建新的Vector2,修改X值并保留原Y值 _scene.SceneItems[0].PositionCords = new Vector2(0, currentCoords.Y);
方案2:将Vector2改为引用类型(class)
如果项目允许修改Vector2的定义,把它从struct改成class。这样获取PositionCords时返回的是对象引用,修改属性会直接作用在原对象上。
注意:如果使用的是Unity等框架自带的
Vector2,该方法不适用,因为框架的Vector2是固定的struct类型。
方案3:在接口中添加修改坐标的方法
在Position接口中新增专门的方法来修改单个坐标值,避免直接操作值类型属性:
// 修改Position接口 interface Position { public Vector2 PositionCords { get; set; } void SetX(float x); void SetY(float y); } // Objects1实现新增方法 class Objects1 : Position { public Vector2 PositionCords { get; set; } public void SetX(float x) { PositionCords = new Vector2(x, PositionCords.Y); } public void SetY(float y) { PositionCords = new Vector2(PositionCords.X, y); } } // 调用方法修改坐标 _scene.SceneItems[0].SetX(0);
额外优化:移除冗余的Scene实例
你的Level类继承了Scene,但又在内部实例化了Scene对象_scene,属于冗余操作。可以直接使用继承自Scene的成员:
class Level : Scene { private Objects1 _itemA; public Level() { _itemA = new Objects1(); SceneItems.Add(_itemA); SceneItems.Add(_itemA); // 使用方案1的方式修改坐标 var currentCoords = SceneItems[0].PositionCords; SceneItems[0].PositionCords = new Vector2(0, currentCoords.Y); } }
内容的提问来源于stack exchange,提问作者worm
相关产品推荐
相关产品推荐

