.net 如何提示静态检查器理解简单的算法?

.net 如何提示静态检查器理解简单的算法?,.net,code-contracts,.net,Code Contracts,我正在处理一个将位图封装为像素数组的对象。 数组是一维的,我将图像的宽度存储在只读字段中。我还添加了一个基于像素阵列长度和宽度计算高度的属性。关于高度,我有以下不变量: 像素数组(数据属性,使用专用数据字段)不为空,并且至少有一个元素 宽度大于零 高度属性的代码: 公共整数高度 { [纯] 得到 { Contract.Requires(数据!=null); 合同要求(宽度>0); 合同要求(数据长度>0); Contract.Result(Contract.Result()>0); Cont

我正在处理一个将位图封装为像素数组的对象。 数组是一维的,我将图像的宽度存储在只读字段中。我还添加了一个基于像素阵列长度和宽度计算高度的属性。关于高度,我有以下不变量:

  • 像素数组(数据属性,使用专用数据字段)不为空,并且至少有一个元素
  • 宽度大于零
高度属性的代码:

公共整数高度
{
[纯]
得到
{
Contract.Requires(数据!=null);
合同要求(宽度>0);
合同要求(数据长度>0);
Contract.Result(Contract.Result()>0);
Contract.EndContractBlock();
合同。假设(数据长度>宽度);
返回数据。长度/宽度;
}
}

但是我不能让静态检查器来证明这一点。问题可能是(据我所知),没有要求
Data.Length%Width==0
,因此由于整数除法
Data.Length/Width
可以为零;因此,我添加了假设,但没有运气。我不知道如何提示静态检查器接受我的确认。

我编写了一个简单的小测试,它似乎通过了

测试对象类:

公共类1
{
公共整数宽度{get;set;}
公共字节[]数据{get;set;}
公共内部高度
{
[纯]
得到
{
Contract.Requires(数据!=null);
合同要求(宽度>0);
合同要求(数据长度>0);
合同。确保(合同。结果()>1);
//合同。假设(数据长度>宽度);
返回数据。长度/宽度;
}
}
}
单元测试:

[TestFixture]
公开课考试
{
[测试]
公共无效1类合同被强制执行()
{
var item=newclass1{Width=1,Data=newbyte[1]};
var h=项目高度;
}
}
请注意,如果我重新启用
假设
约束,那么这将首先触发(并失败),因此
确保
不会被测试。包含单元测试是为了创建对
Height
的调用。没有这一点,代码契约似乎检测到没有使用
高度
,因此不会应用确保约束。另外,我收到的错误消息是
codecontracs:requires为false
,这可能有点误导


我正在使用
代码契约1.4.50327.0
如果有帮助的话?

我写了一个简单的小测试,它似乎通过了

测试对象类:

公共类1
{
公共整数宽度{get;set;}
公共字节[]数据{get;set;}
公共内部高度
{
[纯]
得到
{
Contract.Requires(数据!=null);
合同要求(宽度>0);
合同要求(数据长度>0);
合同。确保(合同。结果()>1);
//合同。假设(数据长度>宽度);
返回数据。长度/宽度;
}
}
}
单元测试:

[TestFixture]
公开课考试
{
[测试]
公共无效1类合同被强制执行()
{
var item=newclass1{Width=1,Data=newbyte[1]};
var h=项目高度;
}
}
请注意,如果我重新启用
假设
约束,那么这将首先触发(并失败),因此
确保
不会被测试。包含单元测试是为了创建对
Height
的调用。没有这一点,代码契约似乎检测到没有使用
高度
,因此不会应用确保约束。另外,我收到的错误消息是
codecontracs:requires为false
,这可能有点误导

我使用的是
代码合同1.4.50327.0
,如果有帮助的话