あなたの質問に対するコメントには、C# のオーバーロード解決仕様へのリンクが含まれています。これには、質問に詳細に答えるために必要なすべての情報が含まれています。ただし、これは最も読みやすいものではなく、あなたの場合の実際の解決方法を見つけるのは難しいため、私が知る限り、次のようになります。
パラメータ配列:
最初に、params
キーワードが何をするかを見る必要があります: これは開発者の利便性のためのショートカットであるため、以下と同じです:
static void TestMethod<T>(params T[] input)
に翻訳されます
static void TestMethod<T>(T[] item)
それに応じて呼び出しが変換されます。
TestMethod("string2", "string2");
に翻訳されます:
TestMethod(new string[] { "string1", "string2" );
解像度:
これを念頭に置いて、コンパイラが何をするか見てみましょう: コンパイラはオプションを評価して、実行時に呼び出しを解決します。
あなたの電話は:
TestMethod("string");
最初のオプションは、この呼び出しを次のように変換することです。
TestMethod(new string[] { "string" });
string
これにより、 asを使用しながらジェネリック バージョンを呼び出すことができT
、「解決されたメソッド シグネチャ」が生成されます。
TestMethod(string[] item)
したがって、実際の引数タイプから必要な引数タイプへの必要な変換は次のとおりです。
string[] to string[]
オプション b は、パラメーター"string"
を私たちの目に見えるものとして解釈することですstring
。次に、非ジェネリック バージョンを呼び出すことが実行可能になります。
string to object
変換は C# 仕様のセクション 7.4.3.4 に従って評価され、文字列からオブジェクトへのダウングレードを回避するために、最初のオプションが選択されます。