“是”运算符如何与动态对象一起使用?

时间:2013-03-28 17:53:12

标签: c# c#-4.0 dynamic dynamic-language-runtime

is运营商如何处理DLR?

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

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

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

2 个答案:

答案 0 :(得分:6)

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

  

默认情况下,Is返回true需要什么条件?

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

  

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

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

答案 1 :(得分:0)

由于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类型相同。