拳击和拆箱如何在C#

时间:2016-03-12 12:44:13

标签: c# c#-4.0 type-conversion boxing unboxing

我知道C#的拳击和拆箱概念用于类型转换。但它如何在C#中用于动态变量。当我们使用动态变量时,如何进行类型转换。它以何种方式遵循c#

的装箱和拆箱原则

我认为装箱和拆箱不会将动态类型视为对象,因为它们不相同。不知道他们是否遵循相同的装箱和拆箱机制 请参阅此链接dynamic vs object type

当您使用dynamic时,整个表达式在编译时被视为动态表达式,这会导致编译器将所有内容视为动态并获得运行时绑定。

这是因为在下面的行str是动态的

    dynamic str = "22/11/2013 10:31:45 +00:01";
    var withOffset = DateTimeOffset.Parse(str);

在编译时str是动态的,str的类型只在运行时才知道,这就是编译器将withOffset视为动态的原因

1 个答案:

答案 0 :(得分:1)

对象和动态在装箱和拆箱时具有相同的行为(您可以在生成的IL代码中进行检查)。

在这种情况下,这两者之间的主要区别是:

  • clr在运行时添加一些IL代码,用于确定它的真实类型以及可以对其执行的操作(有效负载)。
  • 编译器允许您执行:

    1.var withOffset = DateTimeOffset.Parse(str);

    2.DateTimeOffset withOffset = DateTimeOffset.Parse(str);

    3.DateTime withOffset = DateTimeOffset.Parse(str);

    但是在运行时,clr确保类型安全,所以如果你编写案例3,它会编译,但在运行时clr会抛出一个RuntimeBinderException。

希望它有所帮助!