0

我刚刚声明了一个这样的变量:

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

但是 resharper 告诉我,我可以简化表达式,所以我将它改写成这样:

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

AMD 现在 resharper 很满意,但是“异常安全”吗?例如,如果x不是 type ,它会返回 falseFoo吗?

4

3 回答 3

4

NullReferenceException如果 x 不是该类型,第二个将抛出 aFoo

于 2012-12-10T08:38:28.097 回答
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;
于 2012-12-10T08:43:01.713 回答
0

不知道为什么Resharper会这么说,但它是错误的。

与这种情况一样,当x不是Foo 时,它会引发异常。

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

as 运算符允许运行强制转换,但如果失败,则返回null. 所以x as Foo == null, 并且访问属性 ofnull将引发异常。

于 2012-12-10T08:40:09.460 回答