2012-06-26 27 views
3

雖然經歷了一些教程,我曾經遇到過線像這樣:有人可以解釋這個語法的部分,以及它將如何使用?

((IDisposable)foo).Dispose(); 

忽略具體參考IDisposable接口。我很好奇爲什麼括號是按照它們的方式以及它們所包含/所做的。我確信這是一個非常簡單的問題,但由於這種語法的泛型,我一直無法通過搜索找到答案。幫助將不勝感激,謝謝。

+0

您可能想知道爲什麼在調用Dispose之前需要投射,因爲您可能已經靜態地知道'foo'是'IDisposable'。如果'foo's,顯式地實現'IDisposable',那麼你不能直接調用'foo.Dispose()',你需要先執行這個操作。 http://msdn.microsoft.com/en-us/library/ms173157.aspx(@ EugenRieck的答案回答了語法,這是主要部分,我認爲這更適合作爲評論) –

+0

爲了進一步擴展@ TimS的評論,該對象也不一定處於繼承對象的繼承鏈中,因爲自定義顯式或隱式轉換運算符可以允許您從完全不相關的類型轉換爲/從完全不相關的類型轉換(儘管它有限制,例如不允許接口)。 –

回答

3

第一組圓括號將它轉換爲一個IDisposable對象。例如

Object foo = new Object(); 
IDisposable ID; 

現在ID = foo會給一個錯誤,但ID = (IDisposable)foo會工作。

第二組圓括號允許您訪問IDisposable對象的方法和屬性,在本例中爲Dispose()方法。如果你輸入它,你會看到只有當你把第二組圓括號括起來後,intelisense纔會顯示IDisposable對象的方法和屬性。

2
  • 開始用它(IDisposable)foo
  • 前綴它轉換爲所請求的接口
  • 括號告訴.NET是foo是定投的東西,的foo.Dispose()
  • 不是結果將這個
  • 現在添加.Dispose()來解決接口的一種方法
+0

+1關鍵字:[** cast **](http://msdn.microsoft.com/zh-cn/library/ms173105(v = vs80).aspx) –

+0

它會始終是圓括號內的接口在foo之前? – Ari

+0

不,你可以投到任何類型的對象 – Dan

0

這只是進行IDisposable轉換時的快捷方式。

這...

((IDisposable)foo).Dispose(); 

是與此相同...

IDisposable i = (IDisposable)foo; 
i.Dispose(); 
0

內的括號的周圍IDisposable把它變成一個澆鑄,然後將外組括號確保演員在撥打Dispose()之前發生。

2

語法:

var d = (IDisposable)foo; 

被稱爲明確的轉換。

語法:

((IDisposable)foo).Dispose(); 

我們明確地把foo到一個臨時變量,並調用它Dispose(做筆記,臨時變量這裏使用的,但你不能看到它,它是由創建編譯器)。

括號告訴編譯器該操作的優先順序。在這種情況下,它表示在解決Dispose調用之前將變量轉換爲IDisposable。由於之前完成,編譯器現在知道要在IDisposable類型的變量上解析Dispose

你可以看到這種行爲在其他形式:

(foo as IDisposable).Dispose(); 

或者:

string s = null; 

while ((s = Console.ReadLine()) != null) 
{ 
} 

我的第一個例子作爲自己的投蒙上使用as運營商以同樣的方式(在線) 。我的第二個示例在繼續對null進行測試之前設置變量s

我的觀點是,如果不使用括號來定義邊界,它們都不會編譯。

相關問題