我有几个用户控件,它们已订阅另一个类中的事件处理程序。
我正在学习C#中的CodeContracts,我想知道为什么Static Analyzer允许编写如下代码:

void MyUserControl_MouseEnter(object sender, MouseEventArgs e)
{
  MyUserControl item = sender as MyUserControl;
  item.DoSomething(); // I expect some warning here, because item can be null

  sender.Equals(testObject); // This doesn't yield warning either
}


在这里,我有一个潜在的不安全代码,它可能导致空引用异常。
我知道,静态分析器可能无法检查sender的实际类型是什么。但是,如果无法证明这一点,我希望发出一些警告,例如CodeContracts: Possibly calling a method on a null reference

还是我对合同有误解?如何获得有关此类错误的通知?

UPD:

是的,我确实按照答案中的建议启用了Implicit Non-Null Obligation,但是我仍然没有收到来自Static Analyzer的警告。我也尝试使用Microsoft All Rules规则集运行代码分析,也没有警告。 (但我更喜欢处理代码合同并使用Contract类执行一些其他检查,而不是先使用if-then-throw或其他方法)

最佳答案

您应该在静态分析器选项(“项目选项” |“代码分析”)中启用“隐式非空义务”。

10-01 19:19
查看更多