2012-09-29 26 views
0

可能重複:
Direct casting vs 'as' operator?在以下代碼中使用Cast和AS運算符之間的區別?

任何一個可以告訴的代碼片斷之間的實際差異?

var unknown = (object)new List<string>(); 

// Snippet 1: as operator 
foreach (var item in unknown as IList<int>) { 
// Do something with item 
} 


// Snippet 2: cast operator 
foreach (var item in (IList<int>)unknown) { 
// Do something with item 
} 
+0

至於如果轉換失敗將返回null;如果顯式轉換失敗,則會拋出異常。 – Tim

+0

我檢查了您的鏈接,但兩個問題之間存在很大差異。 –

+0

@urzshah區別在於:1)你把它放在一個'foreach'循環中,2)你正在轉換爲一個接口類型。這些差異都與你的問題無關。 – hvd

回答

2

因爲運營商將不會引發錯誤,但不同之處在於它產生空轉換失敗投將提高InvalidCastException

錯誤從MSDN

as運算符是像鑄造,而不是募集一個例外。

expression as type

相當於:

expression is type ? (type)expression : (type)null

除了表達只計算一次。

請注意,as運算符僅執行參考轉換和裝箱轉換。 as運算符不能執行其他轉換,例如用戶定義的轉換,而應該使用轉換表達式來執行轉換。

+0

thnx。從您的回答可以清楚地看出,第一個代碼會拋出空引用異常,但是第二個拋出的Invalid轉換異常會告訴您實際的問題。因此,您必須遠離需要用戶定義的轉換的AS運算符。 –

0

使用的操作不同於在C#中投在三個重要方面:

  1. 它返回null,當你試圖轉換的變量不是請求類型的或它的繼承鏈,而不是拋出異常。

  2. 它只能應用於引用類型變量轉換爲引用類型。

  3. 使用as不會執行用戶定義的轉換,例如隱式或顯式轉換運算符,這些轉換語法將執行此操作。

Referenced Blog

相關問題