在Func <T>参数上指定代码合约?

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>参数必须遵守某些合同?

mrm*_*reg 2

一般来说,这似乎是一个有问题的要求,因为调用f可能会带来副作用,因此指定契约可能会影响该方法的功能。

作为代码契约库的实现者,可以引入包装器代码,用于检查f在方法上下文中调用 的值是否遵守契约(以避免引入虚假方法调用)。由于以下几个原因,这是有问题的:

  1. 该方法可能永远不会调用f,因此调用者可能会违反合同而不会被破坏。
  2. 该方法f只能在完成其他一些工作后才能调用,如果调用f不满足规范,这些工作可能会无效。

如果f没有副作用,那么这些就不会成为问题,但是在存在副作用的情况下,通过始终调用来处理 1f是行不通的,并且f在做任何工作之前调用来处理 2 也不会成功。

因此,总而言之,我认为这是不可能的(在本机代码合约的背景下)并且有充分的理由。