You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:31:30