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

调用带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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:15:35