5

TestMethod<T>(params T[] input)executeではなく execute メソッドを使用するのはなぜですかTestMethod(object input)。なぜコンパイラが一般的なメソッドを実行するのか混乱しています。.net フレームワークに優先順位階層はありますか?

class TestClass
{
    static void Main()
    {
        TestMethod("Hello World");
    }

    static void TestMethod(object input)
    {
        Console.WriteLine("object");
    }

    static void TestMethod<T>(params T[] input)
    {
        Console.WriteLine("params T[]");
    }
}
4

2 に答える 2

5

これは、オーバーロードの解決のためです。

ここに良い記事があります

類似の質問: 一般的な過負荷の解決

ここに画像の説明を入力

于 2013-10-16T09:36:57.720 に答える
5

あなたの質問に対するコメントには、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 に従って評価され、文字列からオブジェクトへのダウングレードを回避するために、最初のオプションが選択されます。

于 2013-10-16T10:16:44.493 に答える