2011-03-30 64 views
0

我有VS2010這個簡單的例子:抽象類作爲ref參數 - 編譯器錯誤

using System; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      AbsClass absClass = new ConClass(); 
      // I have tried this also and the error is different: 
      // ConClass absClass = new ConClass(); 
      absClass.Id = "first"; 
      Console.WriteLine(absClass.Id); 
      MyMethod(ref absClass); // <<- ERROR. 
      Console.WriteLine(absClass.Id); 
      Console.ReadKey(); 
     } 

     public void MyMethod(ref AbsClass a) 
     { 
      a.Id = "new"; 
     } 
    } 

    public abstract class AbsClass 
    { 
     public string Id { get; set; } 
    } 

    public class ConClass : AbsClass { } 
} 

我想知道爲什麼不能建立正確的。

+0

你得到的編譯器錯誤是什麼? – 2011-03-30 22:58:12

+0

「非靜態字段,方法或屬性需要對象引用'ConsoleApplication1.Program.MyMethod(ref ConsoleApplication1.AbsClass)'」 - 有點兒說這一切,不是嗎? – 2011-03-30 23:02:36

+0

@ Femaref的回答是正確的。註釋版本(使用ConClass)不起作用的原因是,作爲參數傳遞給ref參數的變量類型必須完全匹配參數的類型。這可以確保方法中的任何分配都能正常工作。 – 2011-03-30 23:08:08

回答

4

你需要讓你的MyMethod靜:

public static void MyMethod(ref AbsClass a) 
    { 
     a.Id = "new"; 
    } 

的問題不是抽象類,「問題」是靜態Main方法。靜態方法沒有實例,因此不能調用實例方法。

msdn on static classes and static members

+0

是的,沒錯。它現在以靜態方式運行。但爲什麼 ?或者,請聯繫官方文檔閱讀有關它? – ferpega 2011-03-30 23:03:58

+0

對不起......我在代碼下面沒有看到您的評論。你的意思是如果我把它放在一個非主靜態方法原始代碼將運行良好? – ferpega 2011-03-30 23:06:36

+0

我添加了一個鏈接,但簡而言之,原因已在帖子中。 'Main'方法是'static',因此不與'Program'類的特定實例關聯。因此,它只能調用其他不依賴於'Program'實例的方法。 – Femaref 2011-03-30 23:07:10

0

要麼你需要讓你的MyMethod方法靜:

public static MyMethod(ref AbsClass a) 
{ 
    a.Id = "new"; 
} 

或者preferrably,創建Program類的一個實例,並從該實例調用MyMethod

Program p = new Program(); 
p.MyMethod(ref abs); 

之所以第一種方法的作用是因爲Main方法被標記爲靜態,並且不與Program類的實例綁定。 .NET Framework CLR在程序集中搜索名爲Main的靜態方法,該方法採用String的數組,並使該函數成爲入口點。您會注意到很多教程甚至MSDN代碼示例都使用static關鍵字標記了Program類,當一個類中的所有方法僅包含靜態方法時,這被認爲是最佳實踐。

之所以第二種方法的工作原理,以及爲什麼這種方法是首選,是因爲你定義MyMethod是一個實例方法。基本上,您需要一個對象的實例才能執行實例方法;關鍵字new將創建指定類型的實例。可以在沒有對象實例的情況下調用靜態方法,但也不能訪問任何非靜態實例成員(屬性,私有/公共變量等)。通常,除非您必須實現實用程序類,使用擴展方法或提供幫助程序方法,否則您希望避免使用靜態方法和類。

相關問題