2010-09-16 59 views

回答

18

使用as如果對象是錯誤的類型會優雅地失敗,並將得到的值將是空,在一個正常的投會拋出一個InvalidCastException:

object x = new object(); 
string y = x as string; // y == null 
string z = (string)x; // InvalidCastException 
1

as鑄造將nerer拋出一個異常,而通常可以投。

Object a = new Object(); 
String b = a as String; 
if(b != null) // always false for this example. 
{} 
1

普通類型轉換可能返回IllegalTypeCast例外,如as會在這種情況下返回null

1
((Class2) obj) // Throws exception when the casting cannot be made 

Class2 C = obj as Class2 // Will return NULL if the casting cannot be made 
0

as不能與值類型(不可爲空類型)一起使用。

對於引用類型...

expression as type 

是真的一樣

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

除了expression只計算一次。

在對比爾克林頓的點頭,'是'在'表達是類型',我的意思是'is'。

基本上,正如其他答案指出的那樣,這意味着當劇組失敗時返回null。但是,當轉換成功但類型錯誤時,它也會返回null。

這是一個有點傻例如:

uint? u = 52; 
int? i = (int?) u; // 'i' is now 52 

uint? u = 52; 
object d = u; 
int? i = d as int?; 

什麼是我的價值? 52?不。它是空的。

爲什麼在那裏的對象?原來,當我用'是'解釋'as'時,我撒謊了。

觀察:

uint? u = 52; 
int? i = (u is int?) ? (int?) u : (int?) null; 

'i' 是現在null

uint? u = 52; 
int? i = u as int?; 

哎呀。編譯器錯誤。所以,我想這兩種說法畢竟不完全一樣。

+2

總之:就是和現在一樣。 – 2010-09-16 06:13:49

+0

不僅如此,我還需要編寫使用'?'的C#像Lisp使用括號。 :-) – Justin 2010-09-16 06:36:44

7

兩個操作符的用例在表面上相似,但語義上完全不同。演員與讀者溝通「我確信這種轉換是合法的,如果我錯了,我願意接受運行時異常。」 「as」操作符表示「我不知道這種轉換是否合法,我們將試一試,看看它是怎麼回事」。

欲瞭解更多有關此主題的看到關於這個問題我的文章:

http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

+1

它可以傳達,但不一定。當我確定轉換會起作用時,我使用'as'關鍵字,因爲我更喜歡看:'(myobj as MyType).SomeProperty' over'((MyType)myobj).SomeProperty'在這種情況下,我做過的方式表明,如果沒有,我願意在運行時採用'NullReferenceException'。只是想指出這是一個風格的東西。 – jasonh 2010-09-16 08:00:07

+1

@jasonh - 使用'as'這種方式對我來說在文字上是錯誤的。這會讓我們想知道爲什麼演員沒有完成。此外,無效轉換異常會導致開發人員比空引用異常更快地出現問題。我更喜歡Eric的風格。 – 2010-09-16 16:01:49

0

,如果你使用「爲」關鍵字你永遠不會得到一個轉換例外。如果您嘗試進行無效轉換,轉換結果將爲null

隱式/顯式轉換可以在具有繼承/實現關係的類/接口之間使用,否則會產生編譯錯誤。見例如:

public class A {} 
public class B {} 
... 
A a = new A(); 
//B b = (B)a; //compile error:Cannot implicitly convert type 'A' to 'B' 

的另一種情況隱式/顯式轉換是有A類和B之間沒有關係,但你寫一個implicit/explicit自己操作。

0

此外,只能與參考類型一起使用。這實際上非常合乎邏輯,因爲如果轉換失敗,它將返回false,並且這不是值類型的可能值。

因此,對於值類型,必須使用正常類型轉換。