Sco*_*ein 5 c# lambda code-contracts
说我有以下内容
public T Example(Func<T> f)
{
Contract.Requires(f != null);
Contract.Requires(f() != null); // no surprise, this is an error
...
}
Run Code Online (Sandbox Code Playgroud)
有没有办法指定我的Func<T>参数必须遵守某些合同?
一般来说,这似乎是一个有问题的要求,因为调用f可能会带来副作用,因此指定契约可能会影响该方法的功能。
作为代码契约库的实现者,可以引入包装器代码,用于检查f在方法上下文中调用 的值是否遵守契约(以避免引入虚假方法调用)。由于以下几个原因,这是有问题的:
f,因此调用者可能会违反合同而不会被破坏。f只能在完成其他一些工作后才能调用,如果调用f不满足规范,这些工作可能会无效。如果f没有副作用,那么这些就不会成为问题,但是在存在副作用的情况下,通过始终调用来处理 1f是行不通的,并且f在做任何工作之前调用来处理 2 也不会成功。
因此,总而言之,我认为这是不可能的(在本机代码合约的背景下)并且有充分的理由。