上下文连接的“尝试块中的合同部分”错误

本文关键字:合同部 错误 连接 上下文 | 更新日期: 2023-09-27 18:36:32

我写了这个片段和它的合约:

[Pure]
public string getLevelName()
{
    using (var c = new myContext())
    {
        Contract.Ensures(Contract.Result<string>() == c.Level.FirstOrDefault(i => i.levelId == this.levelId).name);
        return c.Level.FirstOrDefault(i => i.levelId == this.levelId).name;
    }
}

但是我收到合同的错误:

尝试块中的合约部分。

对于方法的此类合约,如何避免此错误?

上下文连接的“尝试块中的合同部分”错误

尝试调用另一个方法,

public string getLevelName()
{
    using (var c = new myContext())
    {
       return getLevelNameFrom(c);
    }
}
public string getLevelNameFrom(MyContext c)
{
        Contract.Ensures(Contract.Result<string>() == c.Level.FirstOrDefault(i => i.levelId == this.levelId).name);
        return c.Level.FirstOrDefault(i => i.levelId == this.levelId).name;
}

文档说

此方法调用必须位于方法或属性的开头, 在任何其他代码之前。

在您的样本中

using (var c = new myContext())

将被转换为编译器

try 
{
  c = new myContext();
  Contract.Ensures ...
}
finally
{
   c.Dispose();
}

为避免这种情况,请使用另一个私有方法并在那里传递您的上下文

您必须将所有Contract.Ensures调用放在方法的开头。 using 语句是 try finally 块的简写(编译器会为您推断这一点)。

您的代码:

using (var c = new myContext())
{
    Contract.Ensures(Contract.Result<string>() == c.Level.FirstOrDefault(i => i.levelId == this.levelId).name);
    return c.Level.FirstOrDefault(i => i.levelId == this.levelId).name;
}

变成:

var c = new myContext();
try{
    Contract.Ensures(Contract.Result<string>() == c.Level.FirstOrDefault(i => i.levelId == this.levelId).name);
}
finally
{
    if (c != null)
        ((IDisposable)c).Dispose();
}

所以本质上你是在把一个合约。确保调用到一个try块中(就像错误告诉你的那样)。 请参阅此 msdn 文章 http://msdn.microsoft.com/en-us/library/dd412865.aspx:

此方法调用必须位于方法或属性的开头,在任何其他代码之前。