7

以下のような2つのオーバーロードされたメソッドがあります

 public class TestClass
    {

        public void LoadTest(object param)
        {
            Console.WriteLine("Loading object...");
        }
        public void LoadTest(string param)
        {
            Console.WriteLine("Loading string...");
        }

    }

以下のようにこのメソッドを呼び出すと、出力がLoading string...として表示されます。.net がこのシナリオを処理する方法を説明してください。

 class Program
    {
        static void Main(string[] args)
        {       
            var obj=new TestClass();
            obj.LoadTest(null);
           // obj.LoadType(null);
            Console.ReadLine();
        }
    }
4

4 に答える 4

5

C# コンパイラは、可能な限り具体的なオーバーロードを使用します。

stringでありobject、 の値を持つことができるため、nullコンパイラはstringより具体的であると見なします。

于 2013-08-19T09:18:16.697 に答える
4

nullは有効ですstring

最も具体的なタイプに一致しようとし、stringより具体的ですobject

用途によっては、オーバーロードでパラメーターを完全に削除する必要がありますobject

于 2013-08-19T09:17:03.173 に答える
2

コンパイラは、利用可能なアクセス可能な最も近い特定のメソッド (文字列への null は、オブジェクトへの null よりも近い) を使用するためです。この場合、文字列によるオーバーロードが近いため、呼び出されます。

これはMSDNが言わなければならないことです

候補の関数メンバーと引数リストが識別されると、最適な関数メンバーの選択はすべての場合で同じになります。

  1. 適用可能な候補関数メンバーのセットが与えられると、そのセット内の最適な関数メンバーが特定されます。

  2. セットに関数メンバーが 1 つしか含まれていない場合、その関数メンバーが最適な関数メンバーです。

  3. それ以外の場合、セクション 7.4.2.2 の規則を使用して各関数メンバーが他のすべての関数メンバーと比較される場合、最良の関数メンバーは、指定された引数リストに関して他のすべての関数メンバーよりも優れている 1 つの関数メンバーです。

  4. 他のすべての関数メンバーよりも優れた関数メンバーが 1 つだけない場合、関数メンバーの呼び出しがあいまいになり、コンパイル時エラーが発生します。

于 2013-08-19T09:16:58.733 に答える