2012-12-10 87 views
0

我剛剛宣佈這樣一個變量:簡化速記如果布爾

bool b = (x is Foo) ? (x as Foo).Bar == 1 ? false; 

但ReSharper的告訴我,我可以簡化表達,所以我重寫這樣的:

bool b = (x as Foo).Bar == 1; 

現在AMD的ReSharper滿意,但是「異常安全」?例如,如果x不是類型Foo,它會返回false嗎?

+0

你也可以寫'布爾B =(x爲富)&&((X爲Foo)==標尺示1)' - 稍微短一點 –

+0

也許推薦的原因是由於第二個'?'需要':' - 'bool b =(x是Foo)的事實? (x爲Foo).Bar == 1:false;' –

回答

4

第二個將拋出一個NullReferenceException如果x是類型Foo

+0

'(x爲Foo)'如果轉換不可能返回'null',那麼當你嘗試訪問'Bar'屬性時它會拋出一個異常 –

0

不知道爲什麼ReSharper的講這個的不是,但它是錯誤的。

正如在這種情況下,當x而不是富,它會引發一個異常。

bool b = (x as Foo).Bar == 1; //IF X IS SOMETHING ELSE, EXCEPTION ! 

因爲作爲運營商允許運行投,但在失敗的情況下,返回null。 所以x as Foo == null,並訪問財產null將引發異常。

2

我想Resharper是抱怨,因爲第一個版本投了兩次。這隻會施放一次:

Foo xAsFoo = x as Foo; 
bool b = (xAsFoo != null) ? xAsFoo.Bar == 1 : false; 

或更短:

Foo xAsFoo = x as Foo; 
bool b = (xAsFoo != null) && xAsFoo.Bar == 1;