代码契约:静态方法中不遵守不变量
Code Contracts: Invariants not respected in static method
我读到了类似的问题:
- Code Contracts: Ensure unproven on string method
- Code Contracts: Why are some invariants not considered outside the class?
但这个最小的例子无法静态证明仍然让我感到困惑:
public class Example
{
private const string s = "123";
public int A { get; }
[ContractInvariantMethod]
private void ObjectInvariant()
{
Contract.Invariant(A >= 0);
Contract.Invariant(A < 3);
}
public Example(int a)
{
Contract.Requires(a >= 0);
Contract.Requires(a < 3);
this.A = a;
}
public static char Test(Example x)
{
Contract.Requires(x != null);
return s[x.A];
}
}
它给了我以下警告:
CodeContracts: Missing precondition in an externally visible method. Consider adding Contract.Requires(0 <= x.A); for parameter validation
CodeContracts: Missing precondition in an externally visible method. Consider adding Contract.Requires(x.A < 3); for parameter validation
我尝试了很多方法来实现只读 属性,包括(显式支持字段 + 属性 获取),如其中一个答案所建议的,但 none 有效。
这是一个根本性的交易破坏者,阻止我利用代码契约的静态验证优势。
我想知道为什么这不起作用?我怎样才能让它发挥作用?
这个明确的支持字段 + 属性 为我工作。您还需要确保 属性 得到。
public class Example
{
private const string S = "123";
readonly int a;
public int A
{
get
{
Contract.Ensures(Contract.Result<int>() < 3);
Contract.Ensures(Contract.Result<int>() >= 0);
return a;
}
}
[ContractInvariantMethod]
private void ObjectInvariant()
{
Contract.Invariant(a >= 0);
Contract.Invariant(a < 3);
}
public Example(int a)
{
Contract.Requires(a >= 0);
Contract.Requires(a < 3);
this.a = a;
}
public static char Test(Example x)
{
Contract.Requires(x != null);
return S[x.A];
}
}
我读到了类似的问题:
- Code Contracts: Ensure unproven on string method
- Code Contracts: Why are some invariants not considered outside the class?
但这个最小的例子无法静态证明仍然让我感到困惑:
public class Example
{
private const string s = "123";
public int A { get; }
[ContractInvariantMethod]
private void ObjectInvariant()
{
Contract.Invariant(A >= 0);
Contract.Invariant(A < 3);
}
public Example(int a)
{
Contract.Requires(a >= 0);
Contract.Requires(a < 3);
this.A = a;
}
public static char Test(Example x)
{
Contract.Requires(x != null);
return s[x.A];
}
}
它给了我以下警告:
CodeContracts: Missing precondition in an externally visible method. Consider adding Contract.Requires(0 <= x.A); for parameter validation
CodeContracts: Missing precondition in an externally visible method. Consider adding Contract.Requires(x.A < 3); for parameter validation
我尝试了很多方法来实现只读 属性,包括(显式支持字段 + 属性 获取),如其中一个答案所建议的,但 none 有效。
这是一个根本性的交易破坏者,阻止我利用代码契约的静态验证优势。
我想知道为什么这不起作用?我怎样才能让它发挥作用?
这个明确的支持字段 + 属性 为我工作。您还需要确保 属性 得到。
public class Example
{
private const string S = "123";
readonly int a;
public int A
{
get
{
Contract.Ensures(Contract.Result<int>() < 3);
Contract.Ensures(Contract.Result<int>() >= 0);
return a;
}
}
[ContractInvariantMethod]
private void ObjectInvariant()
{
Contract.Invariant(a >= 0);
Contract.Invariant(a < 3);
}
public Example(int a)
{
Contract.Requires(a >= 0);
Contract.Requires(a < 3);
this.a = a;
}
public static char Test(Example x)
{
Contract.Requires(x != null);
return S[x.A];
}
}