2012-05-30 121 views
0

我想傳遞一個委託作爲參數的一類這樣的傳遞委託給不工作

class Foo 
{ 
    protected delegate void CreateResource(object parameter); 

    protected Foo(CreateResource res) 
    { 
    } 

    public Foo(string resourceName) 
    : this(CreateStreamRes) // Compiler error 
    { 
    } 

    protected void CreateStreamRes(object o) 
    { 
    } 
} 

的構造函數,但我得到的註釋行下面的編譯器錯誤構造函數:「一個對象引用對於非靜態字段,方法或屬性「CreateStreamRes(object)'」是必需的。

但是如果我添加一個變量在構造函數中這樣

public Foo(string resourceName) 
    : this(CreateStreamRes) // Compiler error 
    { 
     CreateResource cr = CreateStreamRes; // OK 
    } 

它編譯該行成功。

看起來像C#將構造函數視爲靜態方法。因爲如果我添加靜態關鍵字到CreateStreamRes(object o)方法它編譯好。

有人可以解釋我爲什麼會發生這種情況?

回答

3

你不能在那裏使用非靜態方法,因爲對象還沒有被構造!只需將CreateStreamRes定義爲靜態,並完成它!

現在,我敢肯定,埃裏克利珀可以給你,爲什麼是這樣的情況下,適當的解釋,但我認爲它是這樣的:使用:this()語法將得到翻譯成調用一個構造函數第一,然後做無論在之後的構造函數體中。所以你不能真正在一個還不存在的對象上使用實例方法,對吧?

你可以分解出的構造的部分身體和調用:

class Foo 
{ 
    protected delegate void CreateResource(object parameter); 

    protected Foo(CreateResource res) 
    { 
     Initialize(res); 
    } 

    protected void Initialize(CreateResource res) 
    { 
    } 

    public Foo(string resourceName)   
    { 
     Initialize(CreateStreamRes(res)); 
    } 

    protected void CreateStreamRes(object o) 
    { 
    } 
} 

這工作,因爲你叫Initialize的時間,對象已被分配。 裏面的構造函數可以自由使用實例方法。

+0

謝謝你們。你說的對象還沒有創建。我認爲這是唯一的情況下,我們可以在對象構建之前調用方法,這就是爲什麼當我看到錯誤時我被震驚。謝謝@達仁我已經按照你的建議進行了重構,現在可以工作。 – Michelle

3

調用:this()關鍵字時無法調用實例方法。這是因爲該類的實例尚未創建。如果你需要調用一些方法,它必須是靜態的。