2016-04-07 3 views
0

私の学習で見つけた次のプログラムがあります。 Class3とclass4メソッドの呼び出しがclass1とclass2と異なる理由を理解していません。私は4つのクラスすべてに違いは見られません。そして、クラス1とクラス2がどのようにして自動的に拡張メソッドを呼び出しますか?次のプログラムで拡張メソッドが明確でない

using System; 

class Class1 { 
} 

class Class2 { 
    public void Method1(string s) { 
     Console.WriteLine("Class2.Method1"); 
    } 
} 

class Class3 { 
    public void Method1(object o) { 
     Console.WriteLine("Class3.Method1"); 
    } 
} 

class Class4 { 
    public void Method1(int i) { 
     Console.WriteLine("Class4.Method1"); 
    } 
} 

static class Extensions { 
    static public void Method1(this object o, int i) { 
     Console.WriteLine("Extensions.Method1"); 
    } 

    static void Main() { 
     new Class1().Method1(12); // Extensions.Method1 is called 
     new Class2().Method1(12); // Extensions.Method1 is called 
     new Class3().Method1(12); // Class3.Method1 is called 
     new Class4().Method1(12); // Class4.Method1 is called 
    } 
} 

助けてもらえますか?

答えて

1

私は4つのクラスすべてに違いは見られません。

もっと見る。 Class1にはネイティブメソッドがまったくありません。他の3つのクラスのメソッドシグネチャはすべて異なります。メソッドのシグネチャは、どのメソッドが呼び出されるかを決定するコンパイラのキーです。


new Class1().Method1(12); // Extensions.Method1 is called 

Class1ネイティブMethod1を持っていない、いわゆることができる唯一のことは、拡張メソッドです。

new Class2().Method1(12); // Extensions.Method1 is called 

Class2、ネイティブMethod1を持っていますが、そのメソッドは、引数としてstringを期待していません。拡張メソッドが期待するものであるintが提供されています。これは、拡張メソッドがなく、Class2に2つのオーバーロードがあり、1つがstringで、1つがintである場合と同じ拡張メソッドに解決されます。

new Class3().Method1(12); // Class3.Method1 is called 

Class3オブジェクトを期待ネイティブメソッドを有します。これは供給される整数によって満たされるので、拡張メソッドより優先されます。上記Class3同じ

new Class4().Method1(12); // Class4.Method1 is called 

、この呼び出しによって満たされるネイティブメソッドがあります。これはさらに具体的であり、intを引数としてとります。

関連する問題