2012-03-28 78 views
8

在下面的代碼中,我必須聲明方法MdrResponseInterpreterstatic否則我有編譯錯誤。爲什麼委託必須是靜態的?

class.... { 

    private StandardBuilder _mdrResponseBuilder = 
     new StandardBuilder(MdrResponseInterpreter); 

    public static bool MdrResponseInterpreter(DNMessageDeliverer builder, 
               DNFieldSet message) 
    { 
     // .... work 
    } 

爲什麼?由於_mdrResponseBuilder也不是一成不變的我希望MdrResponseInterpreter應該能夠訪問this

回答

11

因爲字段初始化沒有獲得this /實例成員。如果您想訪問實例成員,請將初始化移至構造函數。

的規範說:

爲實例字段變量初始值不能引用被創建的實例。因此,它是引用this在變量初始值

雖然您的代碼不明確引用this一個編譯時間錯誤,委託轉換的方法組不引用this隱含如果方法是一個實例成員。

1

您不允許在初始化程序中使用實例成員。

認爲委託具有1)對象引用和2)方法引用。由於您無法訪問this,因此無法設置對象引用,因此將該方法用作委託的唯一方法是將其聲明爲static(因爲對於靜態方法委託對象的引用爲null)。將你的初始化移動到構造函數可以幫助你解決這個問題。

+1

這裏肯定有*是一個對象(否則這個值在哪裏被賦值?),但是你不允許訪問'this'。 – 2012-03-28 09:21:25

+0

當然,我不清楚。更新了我的答案。 – Botz3000 2012-03-28 09:24:10

+0

我仍然認爲它不清楚。對象*確實存在,完全。它可能沒有完全初始化,但在構造函數體中也是如此。 (可能還有其他派生的構造函數體,它們還沒有運行,...) – 2012-03-28 09:25:05

1

該方法必須是靜態的,因爲它在構造函數開始執行之前在對象初始化時被調用。如果您想訪問this,請在構造函數中調用初始化方法。

5

爲了增加CodeInChaos的回答(這是正確的),你可以分配移到構造函數:

private StandartBuilder _mdrResponsBuilder; 

public Foo() // Whatever your type is called 
{ 
    // Simpler syntax for creating a delegate, too. Just use a 
    // method group conversion... 
    _mdrResponsBuilder = MdrResponseInterpreter; 
} 

編輯:以上假設StandartBuilder是一個委託類型。如果它是一個帶有構造函數的類型,則接受委託類型,那麼您需要返回new StandartBuilder(MdrResponseInterpreter),但仍然在構造函數中使用它。

+0

@Downvoter:小心點評? – 2012-03-28 09:28:02

+0

只是想知道,這是如何「_mdrResponsBuilder = MdrResponseInterpreter」是正確的?問題中沒有任何內容表明StandardBuilder是一個委託...它可能是一個在其構造函數中接受Func 的類?順便說一句,我沒有downvote – odalet 2012-03-28 09:56:47

+1

@odalet:是的,這是可能的。我認爲它更可能(給出問題標題)它是一個委託類型。將編輯澄清。 – 2012-03-28 09:58:50

相關問題