我对Code Contracts相当新......我遇到了一个问题。
我有一个方法LINQ查询,它是这样的:
MyClass[] fields =
(from p in rType.GetProperties()
where p.CanRead
let fAttr = p.GetCustomAttributes(typeof(MyClassAttribute), true).SingleOrDefault() as MyClassAttribute
where fAttr != null
select new MyClass(p, fAttr)).ToArray();
我想在我的项目中实现代码契约。我已经做好了一切,直到我达到这一点。当我运行静态检查器时,它向我建议我需要添加一些关于变量p和fAttr的前提条件(Contract.Requires),这些变量在查询中定义。而且,我还有一些未经证实的要求。
我该如何解决这个问题?有什么想法吗?
MyClass还包含两个前提条件:
internal MyClass(PropertyInfo p, MyClassAttribute att)
{
Contract.Requires(p != null);
Contract.Requires(att != null);
...
}
提前致谢:)
答案 0 :(得分:0)
我似乎无法重现这一点。您使用的是最新版本的代码合约吗?
我的整个代码看起来像这样......这是否与你的版本足够接近?
using System;
using System.Diagnostics.Contracts;
using System.Linq;
using System.Reflection;
namespace ConsoleApplication10
{
class Program
{
class MyClassAttribute : Attribute{}
class MyClass
{
internal MyClass(PropertyInfo p, MyClassAttribute a)
{
Contract.Requires(p != null);
Contract.Requires(a != null);
}
}
static void Main(string[] args)
{
var rType = typeof (DateTime);
MyClass[] result = (from p in rType.GetProperties()
where p.CanRead
let fAttr = p.GetCustomAttributes(typeof(MyClassAttribute), true).SingleOrDefault() as MyClassAttribute
where fAttr != null
select new MyClass(p, fAttr)).ToArray();
}
}
}