2010-07-19 96 views
8

所以在工作中,我使用了一個我們沒有寫的API,其中一個方法接受了一個委託。出於某種原因,這個想法在我看來,我有一個符合該簽名的擴展方法,所以我想知道它是否會起作用。我確信它不會讓我驚訝,它確實如此。請允許我以證明:將擴展方法傳遞給期望委託的方法。這個怎麼用?

說我有這些類:

public interface IMyInterface 
{ 

} 

public class MyClass : IMyInterface 
{ 

} 

public static class Extensions 
{ 
    public static string FuncMethod(this IMyInterface imy, int x) 
    { 
     return x.ToString(); 
    } 
} 

現在讓我們說我有一個方法簽名的地方,看起來像這樣:

private static void Method(Func<int, string> func) 
    { 

    } 

現在我的擴展方法(看起來像它)匹配的簽名,但我們都知道,擴展方法只是煙霧和鏡子,所以它真的不符合該簽名。然而,我可以安全地做到這一點:

var instance = new MyClass(); 
Method(instance.FuncMethod); 

我的問題是,這是如何工作的?編譯器爲我做出什麼讓這可以接受。擴展方法的實際簽名需要IMyInterface的實例,但Func不適用於幕後的情況。

回答

0

我不確切知道編譯器在做什麼來允許這些場景,但期望似乎是合理的。也許這個代碼示例將有助於解決這個概念。

MyClass instance = new MyClass(); 
Func<int, string> f1 = instance.FuncMethod; 
Func<int, string> f2 = (i) => instance.FuncMethod(i); 
Func<int, string> f3 = (i) => Extensions.FuncMethod(instance, i);