9

isオペレータは DLR に関して どのように機能しますか?

私の質問をもう少し明確にするために、次の署名を検討してください。

 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 に答える