2013-07-09 30 views
2

我有一個類:不能擴展方法添加到C#的抽象類

namespace MyNamespace 
{ 
    public abstract class Class1 
    { 
     public static string X() 
     { 
      return "Greetings from a method."; 
     } 
    } 
} 

和擴展方法:

namespace MyNamespace 
{ 
    public static class Class1Extension 
    { 
     public static string Y(this Class1 c1) 
     { 
      return "Greetings from extension method."; 
     } 
    } 
} 

,當我嘗試訪問的擴展方法中,編譯器給了我這個錯誤:

'MyNamespace.Class1' does not contain a definition for 'Y' 

下面是我如何使用它:

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.Xml; 
    using MyNamespace; 

    namespace Test_Console 
    { 
     class Program 
     { 
      static void Main(string[] args) 
      { 
       Console.WriteLine(Class1.X()); 
       Console.WriteLine(Class1.Y()); 
       Console.ReadLine(); 
      } 
     } 
    } 

回答

8

您正在嘗試調用擴展方法是這樣的:

Class1.Y(); 

這是行不通的。擴展方法總是一個實例操作,而不是一類本身:

var c = new Class1Impl(); // derived from Class1 
c.Y(); 

換句話說:
擴展方法是添加實例方法類層次結構,而無需實際改變現有類的方法。
您不能使用它們將靜態方法添加到類中。實際上,在C#中沒有任何機制允許將靜態方法添加到類中,而不是將其直接添加到類中的傳統方法。


擴展方法實際上只是語法糖。
編譯器改變了上面的代碼如下:

Class1Extension.Y(c); 
+0

所以擴展方法不是一成不變的? – dpp

+2

擴展方法在技術上是靜態類中的靜態方法,但它們總是在*實例上操作* - 擴展方法的第一個參數是具有'this'限定符。 –

+0

不,擴展方法*是靜態的。 –