代码与不使用它的框架一起收缩

时间:2011-02-08 07:24:24

标签: c# .net nhibernate resharper code-contracts

我有这段代码:

return session.Query<Payment>()
    .OrderBy(payment => payment.Created)
    .Skip((page - 1)*pageSize)
    .Take(pageSize)
    .ToArray();

由于NHibernate的Query方法没有任何Contract.Ensures,我收到此警告:

  

CodeContracts:需要unproven:source!= null

为了解决这个问题,我写了这个:

var query = session.Query<Payment>();
Contract.Assume(query != null);
return query
    .OrderBy(payment => payment.Created)
    .Skip((page - 1)*pageSize)
    .Take(pageSize)
    .ToArray();

这是正确的方法吗?现在Resharper认为查询可以为null,因为我将它与null进行比较。

  

对标有“NotNull”属性的实体

的可能“空”赋值

1 个答案:

答案 0 :(得分:3)

是的,这是正确的方法。 Resharper默认不理解代码合同,请查看this question以解决问题。

你可能想在你的库中创建一个Query方法,该方法只调用NHibernate的Query,但也有一个Ensures合同,以节省你必须在任何地方使用Assume

类似的东西(我猜测这里的类型):

static IQueryable<T> MyQuery<T>(this Session s)
{
    Contract.Requires(s != null);
    Contract.Ensures(Contract.Result<IQueryable<T>>() !=  null);

    var result = s.Query<T>();
    Contract.Assume(result != null);
    return result;
}