【发布时间】:2011-11-18 18:36:32
【问题描述】:
我有几个用户控件,它们订阅了另一个类中的事件处理程序。 我正在学习 C# 中的 CodeContracts,我想知道,为什么静态分析器允许编写这样的代码:
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,但我仍然没有收到来自静态分析器的警告。我还尝试使用Microsoft All Rules 规则集运行代码分析,也没有警告。 (但我更喜欢处理代码合同并使用合同类执行一些额外的检查,而不是使用 if-then-throw 或其他东西)
【问题讨论】:
-
您是否启用了“隐式空合同”?
标签: c# c#-4.0 code-contracts contracts