IEnumerable<T>
メソッドのオーバーロードを広範囲に使用したり、から派生した型のオブジェクトをシリアル化したりするシリアライザーを作成しIDictionary<K,V>
ています。
dynamic
また、キーワードを使用して、シリアル化するオブジェクトの実行時の型に基づいて CLR が正しいオーバーロードを選択できるようにするつもりです。
このコード スニペットを見てください。
void Serialize<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
{
Console.WriteLine("IDictionary<TKey, TValue>");
}
void Serialize<TKey, TValue>(IEnumerable<KeyValuePair<TKey, TValue>> items)
{
Console.WriteLine("IEnumerable<KeyValuePair<TKey, TValue>>");
}
void Serialize<T>(IEnumerable<T> items)
{
Console.WriteLine("IEnumerable<T>");
}
そして、私はこれをしたい:
void CallSerialize(object obj)
{
Serialize(obj as dynamic); //let the CLR resolve it at runtime.
}
のランタイム タイプに基づいてobj
、正しいオーバーロードが呼び出されるようになりました。例えば、
//Test code
CallSerialize(new List<int>()); //prints IEnumerable<T>
この場合、3 番目のオーバーロードが呼び出されます。論理的根拠は非常に単純です。これは実行可能なオプションにすぎません。
ただし、これを行うと:
CallSerialize(new Dictionary<int,int>()); //prints IDictionary<TKey, TValue>
最初のオーバーロードを呼び出します。私はこれを正確に理解していません。3 つのオーバーロードすべてが実行可能なオプションであるのに、最初のオーバーロードに解決されるのはなぜですか?
実際、最初のオーバーロードを削除すると 2 番目のオーバーロードが呼び出され、1 番目と 2 番目のオーバーロードを削除すると 3 番目のオーバーロードが呼び出されます。
メソッドのオーバーロードを解決する際の優先規則は何ですか?