2012-06-13 109 views
1

可能重複:
Why is the 'this' keyword required to call an extension method from within the extended class擴展方法需要「this」來調用?

我有一定的命名空間下宣佈在裝配的擴展方法,這是一個很常見的幫手:

using System; 

namespace Common { 
    public static class GenericServiceProvider { 
     public static T GetService<T>(this IServiceProvider serviceProvider) { 
      return (T)serviceProvider.GetService(typeof(T)); 
     } 
    } 
} 

現在在不同的程序集和名稱空間,我試圖從實現IServiceProvider的類訪問此擴展方法:

using System; 
using Common; 

namespace OtherNamespace { 
    class Bar: IServiceProvider { 
     void Foo() { 
      GetService<IMyService>(); // doesn't compile 
      this.GetService<IMyService>(); // compiles 
     } 
    } 
} 

正如您所看到的,我不能直接調用通用擴展方法,它甚至不會在IntelliSense中顯示。但是,如果我在調用之前添加「this」,它可以正常工作。

這是在Visual Studio 2010中使用.NET 4

這是正常的還是我做錯了什麼?謝謝。

+0

這是呼籲「同一類」擴展方法的正常方式我。在一分鐘內有人給你一個更好/更完整的答案:)。 – nemesv

+0

你** p Robabbly **有一些ambiguos定義另一種方法。 – Tigran

+3

這裏有一個類似的問題:http://stackoverflow.com/a/3513036/1174069 – pjumble

回答

3

這是正常的還是我做錯了什麼?謝謝。

這是正常現象。擴展方法必須擴展。編譯器不會搜索擴展方法,除非有一些如「表達」這是在C#語言規範中定義,7.6.5.2(對的左邊「。):

7.6.5.2 Extension method invocations 

In a method invocation (§7.5.5.1) of one of the forms 
expr . identifier () 
expr . identifier (args) 
expr . identifier <typeargs> () 
expr . identifier <typeargs> (args) 

基本上,你總是需要EXPR東西在這種情況下,this作品,編譯器可以爲改寫這樣的:確保

C . identifier (expr) 
+0

有趣和經過深入研究的答案,謝謝! – Asik

1

這是因爲您只能在該類型的對象上使用擴展方法,並且當您的類繼承IServiceProvider時,在這種情況下您將不得不使用this.。 我希望我明白你的問題,這將使你的答案,但GetService();是不可能的,因爲在任何情況下擴展方法的語法都是不正確的。

+0

準確地說,直接調用它會產生類似這樣的GenericServiceProvider.GetService(this);如果你沒有使用「擴展」部分 – scottheckel

0

擴展方法用於在對象/類的實例中使用。在這種情況下,你有一個靜態類,它就像一個類的唯一實例一樣工作。

所以,如果你創建一個擴展方法,一個對象的實例將能夠使用它。