如何“是”?操作符处理动态对象

本文关键字:处理 动态 对象 操作符 如何 | 更新日期: 2023-09-27 18:06:16

对于DLR, is算子是如何工作的?

为了使我的问题更明确一点,请考虑以下签名:

 public bool Is<T>(Func<dynamic> getInstance)
 { 
     return getInstance() is T;
 }

默认情况下,Is<T>返回true需要满足哪些条件?此外,DLR是否提供任何机制来定制这种行为?

如何“是”?操作符处理动态对象

在运行时,dynamic被视为与object相同,这意味着getInstance委托的结果的运行时类型将用于执行此检查。这里使用dynamic的唯一区别是不会进行编译时检查,并且在运行时将使用动态绑定对getInstance返回的动态对象执行检查。

默认情况下,什么条件是Is返回true所必需的?

传入的委托需要返回一个在运行时与T兼容的类型。

此外,DLR是否提供任何自定义此行为的机制?

。这里将使用c#类型的标准规则。任何自定义行为都需要写入逻辑本身。

由于is已经是一个运行时测试,因此没有额外的运行时绑定正在完成,实际上不会有任何编译的IL差异

 public bool Is<T>(Func<object> getInstance)
 { 
     return getInstance() is T;
 }

Is<T>(Func<object> getInstance)Is<T>(Func<dynamic> getInstance)方法体的IL:

    .maxstack 2
    .locals init (
        [0] bool CS$1$0000)
    L_0000: nop 
    L_0001: ldarg.1 
    L_0002: callvirt instance !0 [mscorlib]System.Func`1<object>::Invoke()
    L_0007: isinst !!T
    L_000c: ldnull 
    L_000d: cgt.un 
    L_000f: stloc.0 
    L_0010: br.s L_0012
    L_0012: ldloc.0 
    L_0013: ret 

所以答案是is关键字不受DLR使用的影响,它的工作原理与使用类型object相同。