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。