gpt4 book ai didi

c# - 诊断 'CodeContracts requires unproven: constructor != null' ?

转载 作者:行者123 更新时间:2023-11-30 22:36:30 25 4
gpt4 key购买 nike

当 C# CodeContracts 时,我有几种报告警告的方法“代码契约(Contract):需要未经证实的:构造函数!= null”静态检查器已启用。

这些特定方法不声明任何契约,也不会被任何声明契约的方法调用。

如果我双击警告,visual studio 会将我引导至实例化 IQueryable<TEntity> 的行目的。这是其中一种违规方法:

public List<IStudentTermData> GetAllActive()
{
using (IObjectContext context = ContextFactory.Create())
{
var studentTermDataSet = context.ObjectSet<IStudentTermData>();
var studentSet = context.ObjectSet<IStudent>();

// Helps out CodeContracts static checker
if(studentSet == null || studentTermDataSet == null)
return new List<IStudentTermData>();

// Selecting the warning brings me to the next line
IQueryable<IStudentTermData> query =
from studentTermData in studentTermDataSet
join student in studentSet
on studentTermData.StudentId equals student.Id
where (student.Active) select studentTermData;

return query.ToList();
}
}

我还有其他几种非常相似的方法,它们没有出现此警告,而且我注意到它们没有使用 LINQ 连接。我猜我的 LINQ 查询正在被解构为一些(可能为 null)IQueryable获取 Join() 的对象调用它,导致此警告。

这与 CodeContracts 静态检查器有什么关系?另外,检查员为何提示,我该如何解决?

最佳答案

这里好像有bug。

您的查询脱糖为:

IQueryable<IStudentTermData> query =
studentTermDataSet.Join(studentSet,
studentTermData => studentTermData.StudentId,
student => student.Id,
(studentTermData, student) => new {studentTermData, student})
.Where(s => (s.student.Active))
.Select(std => std.studentTermData);

唯一称为“构造函数”的参数是 Join 方法的最后一个参数,实际上,如果将代码更改为:

var query =
studentTermDataSet.Join(studentSet,
studentTermData => studentTermData.StudentId,
student => student.Id,
Tuple.Create);

然后它在没有警告的情况下编译。

区别在于第一个查询使用 Join 重载,它将一个 Expression 作为参数,而第二个查询使用一个 Func (并返回一个 IEnumerable)。

所以我认为对表达式树的支持可能还没有完成。您可以在 Code Contracts forum 上发帖提问去问这个。

关于c# - 诊断 'CodeContracts requires unproven: constructor != null' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6977811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com