C# 是否修改“a”的值;盒装“;动态类型的变量是否创建隐式副本?

C# 是否修改“a”的值;盒装“;动态类型的变量是否创建隐式副本?,c#,dynamic,struct,reference,C#,Dynamic,Struct,Reference,当我读到C#的动态实际上是一个 所以我做了这样的事情: struct ValueType { public int test; } public class Test { public static void modifier(dynamic variable) { variable.test = 10; } public static void Main() { ValueType valTypeVar = n

当我读到C#的
动态
实际上是一个

所以我做了这样的事情:

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)变量进行计算。test
。幕后发生了什么?
variable
是否隐式复制到一个新的变量实例,然后对其进行修改?如果是这样,当传递给它一个
引用类型时是否也会发生这种情况


此外,如果上述情况属实,
dynamic
为什么被视为一种引用类型,而它实际上似乎可以随意使用值类型和引用类型的语义,即可以是值类型或引用类型?它通过引用传递给方法这一事实难道不只是一个实现细节吗?

当您调用
modifier
时,您确实在装箱
valTypeVar
。然后,您将对该装箱值进行变异


您将
valTypeVar
的值复制到一个装箱值中并对装箱值进行了变异,这一事实当然不会在调用
modifier
时对
valTypeVar

中的值进行变异。然后,您将对该装箱值进行变异


您将
valTypeVar
的值复制到一个装箱值中并对装箱值进行了变异,这一事实当然不会在调用
modifier
时对
valTypeVar

中的值进行变异。然后,您将对该装箱值进行变异


您将
valTypeVar
的值复制到一个装箱值中并对装箱值进行了变异,这一事实当然不会在调用
modifier
时对
valTypeVar

中的值进行变异。然后,您将对该装箱值进行变异


您将
valTypeVar
的值复制到一个装箱值中,并对装箱值进行了变异,这一事实当然不会使
valTypeVar
中的值发生变异,但我的猜测是-
dynamic
是一种错觉。它会向您和编译器隐藏实际发生的事情,直到它实际发生为止。因此,在运行时,所有内容都会被绑定和验证,并且您不会向方法发送动态数据,而是发送实际的值类型。因此,在这种情况下,它的行为与任何正常值类型一样。让我们看看我是否正确。dynamic是System.Object的语法糖。否则,它不会使值类型表现出不同的行为,它们仍然被装箱,并且您的代码仍然只是更新装箱副本。这段代码只有在使用类的情况下才能工作。不确定,但我猜--
dynamic
是一种错觉。它会向您和编译器隐藏实际发生的事情,直到它实际发生为止。因此,在运行时,所有内容都会被绑定和验证,并且您不会向方法发送动态数据,而是发送实际的值类型。因此,在这种情况下,它的行为与任何正常值类型一样。让我们看看我是否正确。dynamic是System.Object的语法糖。否则,它不会使值类型表现出不同的行为,它们仍然被装箱,并且您的代码仍然只是更新装箱副本。这段代码只有在使用类的情况下才能工作。不确定,但我猜--
dynamic
是一种错觉。它会向您和编译器隐藏实际发生的事情,直到它实际发生为止。因此,在运行时,所有内容都会被绑定和验证,并且您不会向方法发送动态数据,而是发送实际的值类型。因此,在这种情况下,它的行为与任何正常值类型一样。让我们看看我是否正确。dynamic是System.Object的语法糖。否则,它不会使值类型表现出不同的行为,它们仍然被装箱,并且您的代码仍然只是更新装箱副本。这段代码只有在使用类的情况下才能工作。不确定,但我猜--
dynamic
是一种错觉。它会向您和编译器隐藏实际发生的事情,直到它实际发生为止。因此,在运行时,所有内容都会被绑定和验证,并且您不会向方法发送动态数据,而是发送实际的值类型。因此,在这种情况下,它的行为与任何正常值类型一样。让我们看看我是否正确。dynamic是System.Object的语法糖。否则,它不会使值类型表现出不同的行为,它们仍然被装箱,并且您的代码仍然只是更新装箱副本。只有在使用类时,此代码才能工作。