为什么CodeContracts静态分析器不会发出警告?

我有几个用户控件,订阅了另一个类中的事件处理程序。 我在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规则集,也没有警告。 (但我更愿意处理代码合同,并使用Contract类执行一些额外的检查,而不是使用if-then-throw或其他方法)


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


“我怎样才能得到像这样的错误通知?”:在这种情况下,Resharper会警告你。

代码合约会警告你,如果有一个“需要”对象是非空的,该对象可能为空。 你需要一个隐含的“需求”来解决对象的废弃问题,这在表面上似乎是合理的,但是无论出于何种原因,哪个CC似乎都没有提供。

http://msdn.microsoft.com/en-us/library/dd264808.aspx上的文档说它确实执行了这种隐式合同。 我正在进一步研究。

RedHat击败了我。 更多详细信息:您应该检查项目属性的代码合同选项卡中的“静态检查”下的“隐式非空义务”框。


我有类似的问题。 我必须在与“隐式非空义务”复选框相同的面板上打开警告级别滑块。

链接地址: http://www.djcxy.com/p/23739.html

上一篇: Why CodeContracts Static Analyzer doesn't make warnings?

下一篇: CodeContracts issue