如何“是”?操作符处理动态对象
本文关键字:处理 动态 对象 操作符 如何 | 更新日期: 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
相同。