修改动态类型的 "boxed" 变量的值是否会创建隐式副本?

Does modifying the value of a "boxed" variable of the dynamic type create an implicit copy?

当我读到 C# 的 dynamic 实际上是一个 reference type 时,我想到了这个。

所以我想出了这样的东西:

struct ValueType
{
    public int test;
}

public class Test
{
    public static void modifier(dynamic variable)
    {
        variable.test = 10;
    }

    public static void Main()
    {
        ValueType valTypeVar = new ValueType();
        valTypeVar.test = 1;
        System.Console.WriteLine(valTypeVar.test);
        modifier(valTypeVar);
        System.Console.WriteLine(valTypeVar.test);
    }
}

这会打印

1
1

虽然我希望它打印出来

1
10

为什么上面的代码没有按预期工作?该变量肯定已装箱,因此 variable.test = 10; 不可能被评估为 ( (ValueType)variable ).test。幕后发生了什么? variable 是否被隐式复制到一个新的变量实例然后被修改?如果是这样,当它传递一个 class 引用类型时是否也会发生?

此外,如果以上内容属实,为什么 dynamic 被认为是引用类型,因为它实际上似乎随意采用值类型和引用类型的语义,即可以是值类型或参考类型?它通过引用传递给方法的事实不只是一个实现细节吗?

当你叫modifier时,你确实在打拳valTypeVar。然后你正在改变那个装箱的值。

您将 valTypeVar 的值复制到装箱值并改变装箱值的事实当然不会改变 valTypeVar 中的值。