- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当 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/
假设我有以下类层次结构: public class FooBase { private readonly object _obj; protected FooBase(object o
我有一个类似这样的结构: public struct Test { public int x; public int y; public static bool AreEqual(Test
我有一个使用代码契约的 C# PCL 项目。然而,在 TeamCity 上,项目构建失败,但看起来构建在本地是成功的。然而,构建日志确实声称构建确实失败了,但它没有给出任何原因。 “基于警告构建失败”
我有这个代码: public class CodeContractSample { private readonly List _items = new List(); public
我刚刚开始在一个现有的中型项目中试验 .NET 4 中的 CodeContracts,令我惊讶的是静态检查器向我发出有关以下代码片段的编译时警告: public class Foo { priv
我的类(class)有一个子项集合,我有一个公共(public)访问器。我想提供一个后置条件以确保集合中的项目不为空(我知道,在测试 2 和 3 中调用者可以更改集合,但现在我的目标只是确保从属性返回
我有几个用户控件,它们订阅了另一个类中的事件处理程序。我正在学习 C# 中的 CodeContracts,我想知道为什么静态分析器允许编写这样的代码: void MyUserControl_Mouse
我正在尝试在大型桌面应用程序项目中使用 .NET 3.5 的代码契约(Contract),该项目也具有混合模式 C++ DLL 依赖项,用旧的托管 C++ 语法编写。 真正的解决方案至少包含 20 个
请澄清一下,Code Contracts 是否类似于 FxCop 和 StyleCop?根据在线引用,我们需要在现有代码的函数中添加用于实现代码契约条件的代码。 public void Initial
一旦我为代码契约打开代码重写器,我开始发现以前可以工作的代码存在问题。 我有一个 protected volatile bool 成员字段,它在继承 self 的类的其他程序集中是可见的。在我的程序集
我尝试了以下代码来对检索到的实体启用某种非空检查,以确保它们在执行某些具体业务之前存在: protected T GetRequired(object id) where T : Entity
我可以开始使用 CodeContracts 而不是: if (XXX == Y) throw new ArgumentException("bla bla"); 如果我开发了一个库,而我的库用
给定以下 C# 代码, double x = 2.0; x *= 0.5; bool y = (x == 1.0); Console.WriteLine(y); CodeContracts 给出警告:
我终于 catch 了添加到 .NET 3.5/4.0 框架中的所有新功能。最近几天我一直在使用 CodeContracts,我真的很努力地喜欢它们。我很好奇其他人如何看待 C# 中的 CodeCon
我目前正在将 CodeContracts 添加到我现有的代码库中。 事实证明困难的一件事是使用由 NHibernate 水化的实体。 假设这个简单的类: public class Post {
我研究了使用条件框架来验证数据而不是 if(cond) throw new SomeException(); SomeFramework.MakeSure(cond); 最后我的选择是使用 CodeC
当 C# CodeContracts 时,我有几种报告警告的方法“代码契约(Contract):需要未经证实的:构造函数!= null”静态检查器已启用。 这些特定方法不声明任何契约,也不会被任何声明
我是 codeContracts 的新手,我喜欢它,因为它看起来很干净。 我不喜欢我需要下载一个库才能使其工作这一事实。一直不明白为什么微软没有将它作为整个框架的一部分。 我不想强制团队中的其他同事下
我正在寻找一种简单的方法来强制执行 INotifyPropertyChanged 的正确实现,即当 PropertyChanged 被引发时,它必须引用实际定义的属性。我尝试使用 Microsof
我收到此警告但无法找出问题... CodeContracts: warning: The Boolean condition d1.Count != d2.Count always evaluates
我是一名优秀的程序员,十分优秀!