2010-08-12 28 views
6

所以我只是在學習C#,遇到了一些我覺得奇怪的事情......我在和代表玩,並且創建了一個代表DelegateReturnsInt。現在,當我使用一個的foreach循環,這本書說明了使用這樣的:如何在沒有顯式/隱式覆蓋的情況下拋出foreach?

foreach(DelegateReturnsInt del in theDelegate.getInvocationList()) 

現在我知道getInvocationList()返回代表[]數組,但它是如何將它們轉換爲DelegateReturnsInt?我問,因爲我想只是玩,它從一個foreach的for循環改變,所以我創造了這個

Delegate[] del = theDelegate.GetInvocationList(); 
for(int i = 0; i < del.Length; i++){ 
    int result = del[i](); 

但這並不見德爾[I]的方法。我試圖鑄造到DelegateReturnsInt等等,但它給了我關於沒有定義的類型錯誤。

我的大問題是什麼讓foreach()如此特別?

回答

11

它做了隱式投射(如果你看看發射的IL,你會看到它)。這也意味着如果這不是你所說的那樣,你可能會在該行上得到一個意外的演員例外。

+0

Delegate [] del = theDelegate.GetInvocationList(); (int i = 0; i Nicholas 2010-08-12 20:40:12

+0

https://connect.microsoft.com/VisualStudio/feedback/details/530748/new-fxcop-rule-for-net2-on-foreach-in-non-generic-ienumerable – Guillaume 2011-09-16 08:03:45

+0

是的,有一個存在於「foreach」中的「隱形」或「隱式」轉換(除非我在'foreach'中使用'var',這是我真正推薦的)。這種轉換是不可見的,但它可以同時使用隱式類型轉換和顯式類型轉換。例如,從基類型「Delegate」到派生類型「DelegateReturnsInt」(向下)的引用轉換是C#術語中的_explicit引用轉換。因此,「隱形」轉換也適用於顯式轉換(可能會在運行時或過程中拋出「InvalidCastException」)。 – 2016-07-29 23:25:26

相關問題