雖然經歷了一些教程,我曾經遇到過線像這樣:有人可以解釋這個語法的部分,以及它將如何使用?
((IDisposable)foo).Dispose();
忽略具體參考IDisposable接口。我很好奇爲什麼括號是按照它們的方式以及它們所包含/所做的。我確信這是一個非常簡單的問題,但由於這種語法的泛型,我一直無法通過搜索找到答案。幫助將不勝感激,謝謝。
雖然經歷了一些教程,我曾經遇到過線像這樣:有人可以解釋這個語法的部分,以及它將如何使用?
((IDisposable)foo).Dispose();
忽略具體參考IDisposable接口。我很好奇爲什麼括號是按照它們的方式以及它們所包含/所做的。我確信這是一個非常簡單的問題,但由於這種語法的泛型,我一直無法通過搜索找到答案。幫助將不勝感激,謝謝。
第一組圓括號將它轉換爲一個IDisposable對象。例如
Object foo = new Object();
IDisposable ID;
現在ID = foo
會給一個錯誤,但ID = (IDisposable)foo
會工作。
第二組圓括號允許您訪問IDisposable對象的方法和屬性,在本例中爲Dispose()方法。如果你輸入它,你會看到只有當你把第二組圓括號括起來後,intelisense纔會顯示IDisposable對象的方法和屬性。
這只是進行IDisposable轉換時的快捷方式。
這...
((IDisposable)foo).Dispose();
是與此相同...
IDisposable i = (IDisposable)foo;
i.Dispose();
內的括號的周圍IDisposable
把它變成一個澆鑄,然後將外組括號確保演員在撥打Dispose()
之前發生。
語法:
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
。
我的觀點是,如果不使用括號來定義邊界,它們都不會編譯。
您可能想知道爲什麼在調用Dispose之前需要投射,因爲您可能已經靜態地知道'foo'是'IDisposable'。如果'foo's,顯式地實現'IDisposable',那麼你不能直接調用'foo.Dispose()',你需要先執行這個操作。 http://msdn.microsoft.com/en-us/library/ms173157.aspx(@ EugenRieck的答案回答了語法,這是主要部分,我認爲這更適合作爲評論) –
爲了進一步擴展@ TimS的評論,該對象也不一定處於繼承對象的繼承鏈中,因爲自定義顯式或隱式轉換運算符可以允許您從完全不相關的類型轉換爲/從完全不相關的類型轉換(儘管它有限制,例如不允許接口)。 –