假设我有以下内容
public T Example(Func<T> f)
{
Contract.Requires(f != null);
Contract.Requires(f() != null); // no surprise, this is an error
...
}
有什么方法可以指定我的 Func<T>
参数必须遵守一些契约?
最佳答案
一般来说,这似乎是一个有问题的要求,因为调用 f
可能会引入副作用,因此指定契约可能会影响该方法的作用。
作为 Code Contracts 库的实现者,可以引入包装代码来检查 f
的值在您的方法上下文中被调用时是否遵守约定(以避免引入虚假的方法调用)。由于以下几个原因,这是有问题的:
- 该方法可能永远不会调用
f
,因此调用者可能会违反契约(Contract)而不会被破坏。 - 该方法只能在执行一些其他工作后才能调用
f
,如果对f
的调用不满足规范,这些工作可能无效。
如果 f
没有副作用,那么这些都不是问题,但是在存在副作用的情况下,通过始终调用 f
来处理 1 是行不通的,并且在处理 2 之前调用 f
也不会成功。
因此,总而言之,我不认为这是可能的(在 native 代码契约的上下文中)并且没有充分的理由。
关于c# - 在 Func<T> 参数上指定代码契约(Contract)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4060148/