2010-05-08 34 views
0

爲什麼以下代碼行會導致TargetInvocationException異常?TargetInvocationException?

private Dispatcher dispatcher = null; 

    public DownloadManager(Dispatcher dispatcher = null) 
    { 
     this.dispatcher = dispatcher ?? Dispatcher.CurrentDispatcher; 
    } 

DownloadManager在XAML被實例化,如:

<Window.DataContext> 
    <c:DownloadManager /> 
</Window.DataContext> 

注意,調試器不特別突出顯示任何這些線;我所知道的是,如果我刪除它們,我的程序不會崩潰。

回答

2

要通過XAML實例化對象,它需要有一個公共的默認構造函數。具有默認值的參數化構造函數與默認構造函數不同。因此,嘗試實例化對象時,XAML分析器即將死亡。我會說一個帶有NullReferenceException的TargetInvocationException,因爲內在的東西沒有什麼價值,更有用的東西可能會被拋入內部。

最後,FWIW,VS2010中的XAML編輯器告訴我,當我有一個像你的定義的構造函數時,我的類型在沒有默認構造函數的情況下不可用。

使用兩個構造函數,而不是(或只是一個默認的構造函數):

public MyViewModel() 
    : this(null) { 
} 

public MyViewModel(Dispatcher dispatcher = null) { 
    this._dispatcher = dispatcher ?? Dispatcher.CurrentDispatcher; 
} 
+0

是的......你說得很對。我沒有想到會有什麼區別(在默認參數和缺省參數之間)。 – mpen 2010-05-08 07:15:40

+0

後者是編譯器技巧否? – 2010-05-09 01:33:01

1

沒有,我可以直接看到,但看看InnerException如果有一個,它說什麼?

+0

「對象引用不設置到對象的實例。」這意味着什麼? CurrentDispatcher沒有設置?但文件說,如果是這樣的情況下將創建一個新的。 – mpen 2010-05-08 04:21:31

1

只是一個建議。你可以給這個類添加一個默認的構造函數,看看會發生什麼?像這樣:

public DownloadManager() 
{ 
    this.dispatcher = Dispatcher.CurrentDispatcher; 
} 

我想知道XAML是否不喜歡帶默認值參數的構造函數。

+0

像這樣?您的示例有一個參數;) – mpen 2010-05-08 05:58:16

+0

當然,複製和粘貼失敗。 – 2010-05-08 06:11:27

+0

你是對的,但我認爲亞當打敗你一拳:) – mpen 2010-05-08 07:17:08

相關問題