运营商如何处理is
DLR?
为了让我的问题更明确一点,请考虑以下签名:
public bool Is<T>(Func<dynamic> getInstance)
{
return getInstance() is T;
}
默认情况下,Is<T>
返回需要什么条件true
?此外,DLR 是否提供任何机制来自定义此行为?
运营商如何处理is
DLR?
为了让我的问题更明确一点,请考虑以下签名:
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)
和的方法体的 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
。