不能在 ContractClass 中使用 ContractAbbreviator?
Cannot use ContractAbbreviator in ContractClass?
我刚刚开始使用 code-contracts and found that the ContractAbbreviator 属性,可以用简洁的方式描述合同。
但是,我无法在摘要 class 的合同 class 中使用它。
鉴于这个简单 class:
[ContractClass(typeof(MyContractClass))]
internal abstract class MyClass
{
public abstract int Position { get; }
public abstract void Reset();
}
我想写一份合同class确保:
Position
总是大于或等于零。
Position
对于新创建的实例为零。
Reset()
导致 Position
恢复到它的初始值(零)。
所以,我想出了这个合同 class:
[ContractClassFor(typeof(MyClass))]
internal abstract class MyContractClass : MyClass
{
internal MyContractClass()
{
this.EnsuresInitialState();
}
public override int Position
{
get
{
Contract.Ensures(Contract.Result<int>() >= 0);
return default(int);
}
}
public override void Reset()
{
this.EnsuresInitialState();
}
[ContractAbbreviator]
private void EnsuresInitialState()
{
Contract.Ensures(this.Position == 0);
}
}
但是,编译时出现以下错误:
Contract class MyContractClass
references member MyContractClass.EnsuresInitialState
which is not part of the abstract class/interface being annotated.
这是否意味着无法在合同中使用ContractAbbreviator方法class,还是我这里做错了什么?
在这个简单的 class 中,使用缩写词真的没有意义,因为要确保的状态只是一个 属性。然而,在我的真实 class 中,还有其他几个属性我想确保恢复到它们的初始值。
我正在使用 Visual Studio 2013 更新 4。
将 EnsuresInitialState
方法移至摘要 class 并将其标记为受保护。然后在调用它的抽象class中添加一个默认构造函数:
[ContractClass(typeof(MyContractClass))]
internal abstract class MyClass
{
protected MyClass()
{
EnsuresInitialState();
}
[ContractAbbreviator]
protected void EnsuresInitialState()
{
Contract.Ensures(Position == 0);
}
public abstract int Position { get; }
public abstract void Reset();
}
[ContractClassFor(typeof(MyClass))]
internal abstract class MyContractClass : MyClass
{
public override int Position
{
get
{
Contract.Ensures(Contract.Result<int>() >= 0);
return default(int);
}
}
public override void Reset()
{
EnsuresInitialState();
}
}
我刚刚开始使用 code-contracts and found that the ContractAbbreviator 属性,可以用简洁的方式描述合同。
但是,我无法在摘要 class 的合同 class 中使用它。
鉴于这个简单 class:
[ContractClass(typeof(MyContractClass))]
internal abstract class MyClass
{
public abstract int Position { get; }
public abstract void Reset();
}
我想写一份合同class确保:
Position
总是大于或等于零。Position
对于新创建的实例为零。Reset()
导致Position
恢复到它的初始值(零)。
所以,我想出了这个合同 class:
[ContractClassFor(typeof(MyClass))]
internal abstract class MyContractClass : MyClass
{
internal MyContractClass()
{
this.EnsuresInitialState();
}
public override int Position
{
get
{
Contract.Ensures(Contract.Result<int>() >= 0);
return default(int);
}
}
public override void Reset()
{
this.EnsuresInitialState();
}
[ContractAbbreviator]
private void EnsuresInitialState()
{
Contract.Ensures(this.Position == 0);
}
}
但是,编译时出现以下错误:
Contract class
MyContractClass
references memberMyContractClass.EnsuresInitialState
which is not part of the abstract class/interface being annotated.
这是否意味着无法在合同中使用ContractAbbreviator方法class,还是我这里做错了什么?
在这个简单的 class 中,使用缩写词真的没有意义,因为要确保的状态只是一个 属性。然而,在我的真实 class 中,还有其他几个属性我想确保恢复到它们的初始值。
我正在使用 Visual Studio 2013 更新 4。
将 EnsuresInitialState
方法移至摘要 class 并将其标记为受保护。然后在调用它的抽象class中添加一个默认构造函数:
[ContractClass(typeof(MyContractClass))]
internal abstract class MyClass
{
protected MyClass()
{
EnsuresInitialState();
}
[ContractAbbreviator]
protected void EnsuresInitialState()
{
Contract.Ensures(Position == 0);
}
public abstract int Position { get; }
public abstract void Reset();
}
[ContractClassFor(typeof(MyClass))]
internal abstract class MyContractClass : MyClass
{
public override int Position
{
get
{
Contract.Ensures(Contract.Result<int>() >= 0);
return default(int);
}
}
public override void Reset()
{
EnsuresInitialState();
}
}