上下文连接的“尝试块中的合同部分”错误
本文关键字:合同部 错误 连接 上下文 | 更新日期: 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:
此方法调用必须位于方法或属性的开头,在任何其他代码之前。