is
运营商如何处理DLR?
为了使我的问题更加明确,请考虑以下签名:
public bool Is<T>(Func<dynamic> getInstance)
{
return getInstance() is T;
}
默认情况下,Is<T>
返回true
需要哪些条件?此外,DLR是否提供任何机制来定制此行为?
答案 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
类型相同。