9

运营商如何处理isDLR?

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

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

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

4

2 回答 2

6

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

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

传入的委托将需要返回一个在运行时与T.

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

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

于 2013-03-28T17:54:43.400 回答
0

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

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

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

    .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 使用的影响,它的工作方式与使用 type 相同object

于 2013-03-28T18:03:31.620 回答