2009-07-06 35 views
1

調用在以下例外在C#4.0B結果的動態參數的內部構造傳遞一個動態屬性到內部構造

System.ArgumentNullException:值 不能爲空。參數名: 構造

示例代碼(感謝喬恩斯基特)

public class Test 
{ 
    internal Test(string x) 
    { 
    } 

    static void Main() 
    { 
     dynamic d = ""; 
     new Test(d); 
    } 
} 

看來,當它試圖選擇一個正確的運行時不考慮內部構造。這似乎是一個錯誤,所以我張貼在連接: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=472924

看來他們修復了它的新版本。

+0

很難說你在做什麼錯誤而沒有看到任何代碼。請舉個簡短但完整的例子。 – 2009-07-06 14:53:04

回答

1

編輯:好吧,我現在已經跟蹤了很多 - 它使用一個內部構造函數,導致一個問題。

下面是這表明了問題真的短,但完整的例子:

public class Test 
{ 
    internal Test(string x) 
    { 
    } 

    static void Main() 
    { 
     dynamic d = ""; 
     new Test(d); 
    } 
} 

我建議你Connect登錄本 - 然後在這裏發表的URL,我們可以在其上進行表決:)

(我的猜測是,在DLR裏面沒有適當的BindingFlags.NonPublic調用GetConstructor,但這只是一個猜測......)

1

沒有看到代碼,我建議你將一個非實例化的類傳遞給你的構造函數。確保它們在範圍之內並已被實例化,例如在將它們傳遞給非動態對象之前,使用new。

編輯

在看到你的代碼,我會建議你使用DynamicObject而非動態爲你的助手costructor和實體屬性。看到喬恩的回答後

編輯

我認爲這個問題是在使用GetEntity()方法來生成動態對象實例。

我注意到Jon在他使用它的同一範圍內創建了一個MyDynamicObject的實例。

我假設你在GetEntity()方法中生成了你的對象的一個​​實例,在這種情況下,當你使用它時被分類爲一個本地對象。

使用「MyDynamicObject e = entity;」將強制編譯器明確使用MyDynamicObject構造函數並將結果映射到它。因此地址空間已經被分配,並且在將它傳遞給Helper構造函數時被使用。

+0

@Rik - 在看到您的代碼後調整了我的答案。嘗試使用DynamicObject for Entity屬性而不是動態。 – ChrisBD 2009-07-06 15:26:53

+0

你的意思是在助手類?這沒有什麼區別。或者你有另一個更喜歡靜態類型的原因嗎? – Rik 2009-07-06 15:28:23