我最近安装了Code Contracts工具(.NET的代码合同)和Code Contracts编辑器扩展VS2012,并且在正确使用静态检查器方面遇到了些问题。
假设关于 Count 属性是必需的,因为构造函数的确保仍然无法工作。另一方面,IndexOf 方法的确保非常有效。
现在我想知道为什么静态检查器无法识别 ReadOnlyCollection 构造函数的确保。这可能是静态分析器中的错误吗?
当我在下面的代码上运行Code Contracts的静态检查器(第二个假设被注释掉时)
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics.Contracts;
public class TestClass
{
public ReadOnlyCollection<byte> Foo()
{
Contract.Ensures(Contract.Result<ReadOnlyCollection<byte>>().Count == 4);
IList<byte> list = new byte[4];
Contract.Assume(list.Count == 4);
var returnValue = new ReadOnlyCollection<byte>(list);
//Contract.Assume(returnValue.Count == 4);
return returnValue;
}
}
我收到一个"确保未经证明"的警告,内容如下:
CodeContracts: 确保未经证明:
Contract.Result<ReadOnlyCollection<byte>>().Count == 4
它声称 Foo
方法的确保未经证明。然而,当我将鼠标悬停在 ReadOnlyCollection<T>
的 构造函数 上时,我可以知道所构造对象的 Count
属性被确保等于 list
参数的 Count
属性:
也就是说,静态检查器应该能够判断 returnValue.Count == 4
(即 Foo
的确保)为真。如果我取消第二个假设,则警告会消失,但假设我的方法的确保为真非常有违静态检查器的初衷。
public int Boo()
{
Contract.Ensures(-1 <= Contract.Result<int>());
Contract.Ensures(Contract.Result<int>() < 4);
IList<byte> list = new byte[4];
var collection = new ReadOnlyCollection<byte>(list);
Contract.Assume(collection.Count == 4);
return collection.IndexOf(0);
}
假设关于 Count 属性是必需的,因为构造函数的确保仍然无法工作。另一方面,IndexOf 方法的确保非常有效。
现在我想知道为什么静态检查器无法识别 ReadOnlyCollection 构造函数的确保。这可能是静态分析器中的错误吗?