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

Point结构体扩展方法无法实现偏移及链式调用的问题咨询

问题原因与解决方案

问题出在Point是值类型(struct),扩展方法的参数默认是值传递——你在Add方法里修改的只是原p1的副本,原实例不会被改变,而且你调用时没有接收方法返回的新实例,所以p1的值始终没变。

修复方法

不需要修改你的扩展方法(它已经正确返回了修改后的新Point实例),只需要在调用时接收返回值,把新实例赋值给原变量:

var p1 = new Point(1, 2);
Console.WriteLine("Before p1:{0}", p1);
// 接收扩展方法返回的新实例,更新p1
p1 = p1.Add(new Point(1, 0));
Console.WriteLine("After p1:{0}", p1);

运行结果会符合预期:

Before p1:{ X = 1,Y = 2}
After p1:{ X = 2,Y = 2}

链式调用支持

你的扩展方法设计已经满足链式调用需求,只要保证每个后续方法(比如Round、RotateAround)都返回新的Point实例,就可以直接链式调用,最后把结果赋值给变量即可:

var p2 = new Point(5, 5);
// 链式调用:依次执行Add→Round→RotateAround,最终得到处理后的新实例
var processedPoint = p1.Add(new Point(1, 0))
                       .Round()
                       .RotateAround(p2, 45);

补充说明

值类型和引用类型的参数传递逻辑不同:引用类型传递的是引用,修改参数会影响原实例;但值类型传递的是副本,修改副本不会影响原实例。所以对于struct类型,这类"修改"操作的扩展方法都应该返回新实例,再通过赋值来更新原变量。

内容的提问来源于stack exchange,提问作者Orien

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:07:21