C# 如何为具有必需构造函数参数的类创建契约类?

C# 如何为具有必需构造函数参数的类创建契约类?,c#,.net,code-contracts,C#,.net,Code Contracts,我有一个抽象类,其构造函数需要一个参数。参数不能为null // the abstract class [ContractClass(typeof(AbstractClassContract))] public abstract class AbstractClass { // Constructor with required parameter protected AbstractClass(SqlConnection connection) { Contrac

我有一个抽象类,其构造函数需要一个参数。参数不能为null

// the abstract class
[ContractClass(typeof(AbstractClassContract))]
public abstract class AbstractClass
{
   // Constructor with required parameter
   protected AbstractClass(SqlConnection connection)
   {
      Contract.Requires(connection != null);
      Connection = connection;
   }

   protected SqlConnection Connection { get; set; }

   public abstract string GetSomething();
}
抽象类有一个契约类,用于检查抽象成员的前置/后置条件

// the contract class
[ContractClassFor(typeof(AbstractClass))]
public abstract class AbstractClassContract
{
   public override string GetSomething()
   {
      Contract.Ensures(Contract.Result<string>() != null);
      return default(string);
   }
}
但这是合同类的有效构造函数吗?它在某些情况下会引起问题吗?我关心的是,抽象类的构造函数最终需要这个参数


如果它是有效的,那么.NET是如何绕过所需的参数限制的呢?

我已经有一段时间没有研究代码契约了,但我希望您的契约类从未实际实例化过。相反,契约检查器基本上会将契约类中的代码吸入每个具体的子类中

因此,如果我正在编写,您在
AbstractClassContract
中的构造函数应该可以。或者你可以使用
newsqlconnection(“这是从未调用过的”)
更清楚地说:)

你说得对——我使用了一个调试器,并确认合同类的构造函数从未真正调用过。正如您所建议的那样,contract类中的前置/后置条件检查就像它们是具体子类的一部分一样运行(即使堆栈跟踪也表明了这一点)。所以契约类的构造函数只是为了展示。。。我想这会让编译器高兴。
   public AbstractClassContract(SqlConnection connection)
      : base(connection)
   { }