Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 如何避免;来源=空";当使用代码契约和Linq To Sql时?_Linq To Sql_Code Contracts - Fatal编程技术网

Linq to sql 如何避免;来源=空";当使用代码契约和Linq To Sql时?

Linq to sql 如何避免;来源=空";当使用代码契约和Linq To Sql时?,linq-to-sql,code-contracts,Linq To Sql,Code Contracts,我使用正常数据上下文编写了以下代码,效果非常好: var dc = new myDataContext(); Contract.Assume(dc.Cars!= null); var cars = (from c in dc.Cars where c.Owner == 'Jim' select c).ToList(); 但是,当我将筛选器转换为如下扩展方法时: var dc = new myDataContext(); Contract.Assu

我使用正常数据上下文编写了以下代码,效果非常好:

var dc = new myDataContext();
Contract.Assume(dc.Cars!= null);
var cars = (from c in dc.Cars
            where c.Owner == 'Jim'
            select c).ToList();
但是,当我将筛选器转换为如下扩展方法时:

var dc = new myDataContext();
Contract.Assume(dc.Cars!= null);
var cars = dc.Cars.WithOwner('Jim');

public static IQueryable<Car> WithOwner(this IQueryable<Car> cars, string owner)
{
    Contract.Requires(cars != null);
    return cars.Where(c => c.Owner == owner);
}
var dc=new myDataContext();
合同.假设(dc.Cars!=null);
var cars=dc.cars.WithOwner('Jim');
具有所有者的公共静态IQueryable(此IQueryable车辆,字符串所有者)
{
合同。要求(车辆!=空);
归还车辆。其中(c=>c.Owner==Owner);
}
我得到以下警告:

警告:CodeContracts:需要未经验证的:源!=空的


我猜您的警告是由车主参数引起的,而不是由汽车引起的。在WithOwner方法中添加一个先决条件,以检查owner是否为null

public static IQueryable<Car> WithOwner(IQueryable<Car> cars, string owner)
{
    Contract.Requires(cars != null);
    Contract.Requires(!string.isNullOrEmpty(owner));
    return cars.Where(c => c.Owner = owner);
}
public static IQueryable with owner(IQueryable cars,string owner)
{
合同。要求(车辆!=空);
Contract.Requires(!string.isNullOrEmpty(owner));
归还车辆。其中(c=>c.Owner=Owner);
}
在您的第一个代码示例中,您使用了“Jim”硬编码,因此没有问题,因为不存在可以为null的内容


在第二个示例中,您创建了一个静态编译器无法证明源(作为所有者)“永远不会为null”的方法,因为其他代码可能会使用无效值调用它。

我想知道如何使用扩展方法编译代码,因为您的方法签名中缺少此关键字

public static IQueryable<Car> WithOwner(this IQueryable<Car> cars, string owner)
{
    ...
}
public static IQueryable with owner(此IQueryable cars,字符串owner)
{
...
}

/KP

可能是您的代码片段没有完全描述您正在使用的代码

请考虑以下代码段:

var dc = new myDataContext();
Contract.Assume(dc.Cars!= null);
var models = dc.Cars.WithOwner('Jim').Select(c => c.Model);

public static IQueryable<Car> WithOwner(this IQueryable<Car> cars, string owner)
{
    Contract.Requires(cars != null);
    return cars.Where(c => c.Owner == owner);
}

这个契约应该可以,因为
其中
不会返回null,而是在没有匹配项时返回
可枚举的.Empty()

我们在几个版本中修复了这个问题。该警告是由于在Linq表达式构造等方面缺少一些约定造成的。Linq表达式方法具有约定,C#编译器生成调用这些方法的代码。如果我们对调用的方法没有足够的post条件,那么您可能会收到这些关于代码的神秘警告,而您甚至不知道这些代码是否存在(除非您使用ILdasm)。

此外,如果您查看消息,代码契约可能会自动建议此(或另一)先决条件。可疑。没有理由抱怨
null
所有者。我打赌
c==null
,也就是说,不能保证
cars
中的所有项目都不为null。
Contract.Ensures(Contract.Result<IQueryable<Car>>() != null);