我有几个用户控件,它们在另一个类中订阅了事件处理程序。 我正在学习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
规则集运行代码分析,也没有警告。 (但我更喜欢处理Code Contracts并使用Contract类执行一些额外的检查,而不是使用if-then-throw或其他东西)
答案 0 :(得分:3)
您应该在静态分析器选项(项目选项|代码分析)中启用“隐式非空义务”。
答案 1 :(得分:0)
“我怎样才能收到这样的错误通知?”:Resharper会在这种情况下发出警告。
代码合同将警告您,如果“Requires”表示对象为非null,则该对象可能为null。你要求对象取消引用隐含的“要求”,从表面来看似乎是合理的,但无论出于何种原因,CC似乎都没有提供。
http://msdn.microsoft.com/en-us/library/dd264808.aspx处的文档说它确实执行了这样一个隐含的合同。我正在进一步研究它。
RedHat打败了我。更多详细信息:您应该检查项目属性的“代码合同”选项卡中“静态检查”下的“隐式非空义务”框。
答案 2 :(得分:0)
我有类似的问题。我不得不在“Implicit Non-Null obligation”复选框的同一面板上调高警告级别滑块。
答案 3 :(得分:-1)
在代码分析标签上项目的属性页面中,您可以更改规则。