如果is运算符返回true,则as运算符的结果是否为null?

Zac*_*Zac 5 c# casting

我正在使用代码质量工具,他们说我可以在第3行的以下块样式中使用null deference:

1    if(var1 is Type1)
2    {
3         (var1 as Type1).methodCall();
4    }
Run Code Online (Sandbox Code Playgroud)

它消化了以下变化:

1    Type1 tempVar = var1 as Type1; 
2    if(tempVar != null)
3    {
4         tempVar.methodCall();
5    }
Run Code Online (Sandbox Code Playgroud)

这如何改变null deference异常的可能性?根据msdn,如果"提供的表达式为非null,则返回true,并且可以将提供的对象强制转换为提供的类型,而不会引发异常." (http://msdn.microsoft.com/en-us/library/scekt9xw.aspx)

什么senerio在哪里var1 is Type1评估为True,但var1 as Type1评估为null.或者这是不可能的,只是代码质量工具的限制.

我正在使用jetbrains re-sharper和hp fortify.

Ser*_*rvy 10

第一个程序抛出NRE的唯一方法是var1在检查之后和方法调用之前是否可能从另一个线程变异.假设您不需要协同处理来自另一个线程的突变(或者已经有适当的同步),这是代码分析工具的误报,并且您的原始代码不会抛出NRE.

  • 强制性的警告,在多线程场景和非常糟糕的代码中,tempVar在检查后确实可能为空,但这几乎不太可能. (3认同)
  • +1.另一个明显的可能性是`Type1 var1 {get {return count ++ == 0?null:someValue;}`但可能不是这种情况(顾名思义是局部变量). (2认同)