.NET 4代码合同:"要求未经证实:source!= null"

Ver*_*ern 5 .net linq code-contracts

我刚开始在项目中使用代码契约.但是,我的存储库实现存在问题,它使用实体框架查询我的数据库.

我有以下方法:

public IEnumerable<Organization> GetAllOrganizations()
{
    return _uow.CreateSet<Party>().OfType<Organization>().AsEnumerable();
}
Run Code Online (Sandbox Code Playgroud)

该方法返回一个包含数据库中所有组织的集合,或者一个空集合,它不是数据库中的组织.

但是,根据CodeContracts,这是不行的,它给了我错误:"需要unproven:source!= null"

它试图告诉我什么?我可以通过使用Contract.Assume来满足代码契约,假设它总能找到一些东西,但是我需要在从数据库中读取数据的所有方法中都这样做.

我在这里遗漏了什么,或者当你使用数据库和LINQ时,它是否是预期的行为?

小智 2

我的猜测是,CreateSet、OfType 和 AsEnumerable 方法之一被声明为带有名为“source”的 this 参数的扩展方法,而 CodeContrcts 无法证明它不为 null。另外,您不需要添加 Requires 子句来指定 _uow 在条目上不为空吗?

CreateSet 似乎是扩展方法,因为它没有出现在 MSDN 中。如果该方法不应该返回 null,您可以通过将此约定添加到来强制执行此操作CreateSet

Contract.Ensures(Contract.Result<T>() != null);
Run Code Online (Sandbox Code Playgroud)

当 CodeContracts 分析器看到此规则时,它将作为输入OfType不会为空的证据,并且警告应该消失。