2012-10-30 47 views
0

我正在經歷其低於
Oveloaded函數靜態方法錯誤

class Program 
{ 
    public static void Show(String pstrMessage) 
    { 
     Console.WriteLine(pstrMessage); 
    } 
    public void Show(Object obj) 
    { 
     Console.WriteLine(obj.ToString()); 
    } 
    static void Main(string[] args) 
    { 
     Program program=new Program(); 
     program.Show("Test Message"); 
    } 
} 

當我刪除它工作正常靜態函數的例子。
其他方面,它給我一個編譯時錯誤。
無法在非靜態上下文中訪問靜態方法「show」。
因爲我認爲object是所有的基類,所以它應該自動被類型化爲對象(隱式類型轉換)。
任何人都可以解釋爲什麼它給出了一個錯誤。


感謝

+0

http://msdn.microsoft.com/en-us/library/79b3xss3(v=VS.80).aspx –

回答

3

沒有理由爲Show(Object)是一個非靜態成員函數。也聲明那個函數static

然後,您需要使用Program.Show(使用類名稱)而不是program.Show(使用實例名稱),因爲您正在調用靜態函數。

+0

是的你是對的,但我想知道它爲什麼給我編譯錯誤。 「顯示方法(object)」應該是靜態的區域? –

+0

由於C#要求在引用靜態成員時使用* class *的名稱(不是實例),因此您會收到錯誤消息。 –

+0

但是,當我刪除靜態方法它工作正常? –

3

當多個方法名稱匹配時,編譯器運行重載解析程序來決定哪種方法更具體。在你的情況下,靜態過載碰巧是最具體的,因爲它需要string而不是object。編譯器會抱怨你應該使用Program.Show("Test Message");

+0

你的意思是說編譯器對調用靜態或非靜態方法不是很聰明嗎?或者它首先查找重載,然後查找靜態和非靜態 –

+0

@krshekhar編譯器的工作就是按照你所說的去做,而不是去做它認爲你想要的東西。即使你的代碼明確說你想要一個實例方法被調用,編譯器也不會聰明地猜測你的意圖,並且默默地調用靜態方法。 – dasblinkenlight

0

如果你想使用實例函數,只需使用program.Show((Object)「Test Message」);

+0

這是一種調用函數的方法。我想知道爲什麼不在上面工作。 –

+0

構建完成後,每個函數都有它的地址。你想調用函數Show(string),所以不能用實例指針訪問函數。不熟悉c#,但在C++中。下面的代碼工作well.class MyClass的 { 市民: \t無效的print() \t { \t \t的cout << 「打印」; \t} }; int _tmain(int argc,_TCHAR * argv []) { \t MyClass * pMyClass = NULL; \t pMyClass-> print(); } –