使用"as"运算符可能出现Null Reference Exception

Har*_*ine 1 c# resharper nullreferenceexception

在以下代码中:

MyObject objInstance;

private void someEventHandler(object sender, EventArgs e)
{
    if (sender == objInstance && (sender as MyObject).SomeBoolProperty)
        // Do Something
}
Run Code Online (Sandbox Code Playgroud)

Resharper警告sender as MyObject可能是一个可能的NullReferenceException.这个代码可以吗?我假设如果sender == objInstance(sender as MyObject)不会返回null,但这不是第一次Resharper消息告诉我C#行为/功能我不知道.

key*_*rdP 6

当您使用as时,null如果无法转换对象(在本例中为to MyObject),则返回.因此,您的行(sender as MyObject)可能为null.


Jar*_*Par 5

这段代码肯定会导致NullReferenceException抛出.考虑的情况下objInstance,并sender具有价值null.在这种情况下,sender == objInstancetrue因为null == null,因此sender as MyObject也将返回null,代码将抛出属性访问

编写该代码的最佳方式是

var senderObj = sender as MyObject;
if (senderObj != null && 
    senderObj == objInstance && 
    senderObj.SomeBoolProperty) { 
  // Do something
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我不相信有一种方法可以显着简化这段代码.您尝试表达的3个特定的无关条件.因此,他们都必须进行测试