调用带dynamic参数的结构体方法时,结构体是否会被复制?
结构体值类型结合dynamic的异常行为解析
问题重现
代码定义
public class MyClass { private MyStruct ms; public MyClass() { ms = new MyStruct(""); } public void Add(dynamic d) { ms.Add(d); } public void Print() { Console.WriteLine("L: " + ms.GetLength()); } } public struct MyStruct { private dynamic[] items; public MyStruct(string junk) { items = new dynamic[0]; } public int GetLength() { return items.Length; } public void Add(dynamic d) { Array.Resize<dynamic>(ref items, items.Length + 1); items[items.Length - 1] = d; } }
运行代码及结果
MyClass mc = new MyClass(); mc.Print(); mc.Add("Test"); mc.Print();
运行后两次Print均输出 L: 0,而非预期的L: 0和L: 1。
已知有效修复方式
- 将
MyClass的Add方法参数改为非dynamic类型(例如string)。 - 在
MyClass.Add方法内将dynamic参数转换为具体类型(如string)后再调用ms.Add。
核心疑问
已知结构体是值类型,传递时会复制,但此处直接访问类的私有结构体字段ms调用方法,为何会出现修改未持久化的情况?明明操作的应该是原结构体而非副本,无法理解dynamic参数引发的这一行为。
内容的提问来源于stack exchange,提问作者S. J.
相关产品推荐
相关产品推荐

