.NET 4代码合同:“合同”;需要未经验证的:源!=空";

.NET 4代码合同:“合同”;需要未经验证的:源!=空";,.net,linq,code-contracts,.net,Linq,Code Contracts,我刚开始在我的项目中使用代码契约。但是,我的存储库实现有一个问题,它使用实体框架查询我的数据库 我有以下方法: public IEnumerable<Organization> GetAllOrganizations() { return _uow.CreateSet<Party>().OfType<Organization>().AsEnumerable(); } public IEnumerable GetAllOrganizations() {

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

我有以下方法:

public IEnumerable<Organization> GetAllOrganizations()
{
    return _uow.CreateSet<Party>().OfType<Organization>().AsEnumerable();
}
public IEnumerable GetAllOrganizations()
{
返回类型()的_uow.CreateSet().AsEnumerable();
}
该方法返回一个包含数据库中所有组织的集合,或者返回一个空集合,因为数据库中没有组织

但是,根据CodeContracts,这是不好的,它给了我一个错误:“requires unproven:source!=null”

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


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

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

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

Contract.Ensures(Contract.Result<T>() != null);
Contract.Contract(Contract.Result()!=null);

当CodeContracts analyzer看到此规则时,它会将其作为类型的
输入不为空的证据,并且警告应该消失。

什么是“源”?你调用的任何方法都有合同吗?问题有帮助吗?@Anon:我不知道“来源”是什么。我不知道实体框架中的方法是否有契约,但我不这么认为@阿德里安·班克斯:不,对不起,我看不出这对我有什么帮助。它很可能是
asenemerable
,它有一个
源代码!=空
前提条件。我不确定实体框架中是否有许多(任何?)方法契约,因此
CreateSet
of type
都没有后置条件。您可能需要创建自己的包装函数。只有当代码的调用方负责满足该前提条件时,才能设置该前提条件。在本例中,似乎_uow是内部责任,而不是调用方的责任。您是对的,我需要一个Requires子句来指定_uow是非null的。但在加上这些之后,我仍然得到了错误@波格斯:我认为你是对的,这里的原因是可计算的。我已经用AsEnumerable做了一些测试,我也遇到了这个问题。在使用不使用代码契约的第三方API时,为许多函数编写包装函数似乎是一项相当繁琐的任务。我将不得不重新考虑使用代码契约。@Vern:是的,我认为一个很大的特点是用户能够在第三方库上声明契约。你不应该像KoMet说的那样对内部字段使用Requires()。