2011-11-18 82 views
3

我有几个用户控件,订阅了另一个类中的事件处理程序。 我正在学习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规则设置,也没有警告。 (但我宁愿处理代码契约和使用合同类执行一些额外的检查,而不是用IF-THEN掷或别的东西)

+0

您是否启用了“隐式空合约”? – CodesInChaos

回答

0

“我怎样才能得到通知这样的错误呢?”:ReSharper的意志在这种情况下警告你。

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

文档在http://msdn.microsoft.com/en-us/library/dd264808.aspx说,它并执行这样的隐性契约。我正在进一步研究。

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

-1

性能代码分析选项卡上的项目,你可以改变规则

+1

代码分析!=代码合同 – SLaks

3

你应该能够在静态分析选项“隐非空的义务”(工程选项|代码分析)。

0

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

相关问题