c# - 在 Func<T> 参数上指定代码契约(Contract)?

标签 c# lambda code-contracts

假设我有以下内容

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 的值在您的方法上下文中被调用时是否遵守约定(以避免引入虚假的方法调用)。由于以下几个原因,这是有问题的:

  1. 该方法可能永远不会调用 f,因此调用者可能会违反契约(Contract)而不会被破坏。
  2. 该方法只能在执行一些其他工作后才能调用 f,如果对 f 的调用不满足规范,这些工作可能无效。

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

因此,总而言之,我不认为这是可能的(在 native 代码契约的上下文中)并且没有充分的理由。

关于c# - 在 Func<T> 参数上指定代码契约(Contract)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4060148/

相关文章:

C# 用 LINQ 用相同的模式替换 List<string> 的所有元素

c++ - 如何在 lambda 捕获列表中创建指针?

autocomplete - ReSharper在lambda表达式中具有匿名类型的自动完成行为

c# - 如何创建一个 IEnumerable 以在单个语句中延迟获取所有 X

c# - 'C# in depth' 中的抽象类实例化

c# - 代码契约(Contract)由于潜在的副作用而导致错误

c# - 如何在分离的 Entity Framework 4.1 POCO 实体上保存更新的多对多集合

c# - Asp.Net 刷新页面的静态方法

c# - 如何反向迭代队列?

c# - 如何避免 Code Contracts 语句中的代码重复