gpt4 book ai didi

c# - "Invariant unproven"使用在返回语句中创建特定新对象的方法时

转载 作者:IT王子 更新时间:2023-10-29 04:51:20 27 4
gpt4 key购买 nike

尽管 _foo 不可能为 null,但下面的简单代码将由代码契约的静态检查器产生“不变的未经证实”的警告。该警告针对 UncalledMethod 中的 return 语句。

public class Node
{
public Node(string s1, string s2, string s3, string s4, object o,
string s5)
{
}
}

public class Bar
{
private readonly string _foo;

public Bar()
{
_foo = "foo";
}

private object UncalledMethod()
{
return new Node(string.Empty, string.Empty, string.Empty, string.Empty,
GetNode(), string.Empty);
}

private Node GetNode()
{
return null;
}

public string Foo
{
get
{
Contract.Ensures(Contract.Result<string>() != null);
return _foo;
}
}

[ContractInvariantMethod]
private void Invariants()
{
Contract.Invariant(_foo != null);
}
}

除了这个警告完全无效之外,它只在某些特定情况下才会出现。更改以下任何都会使警告消失:

  1. 内联 GetNode 因此返回语句如下所示:

    return new Node(string.Empty, string.Empty, string.Empty, string.Empty, null,
    string.Empty);
  2. Node 的构造函数中删除任何参数 s1 到 s5。
  3. Node 的构造函数中的任何参数 s1 到 s5 的类型更改为 object
  4. GetNode 的结果使用一个临时变量:

        var node = GetNode();
    return new Node(string.Empty, string.Empty, string.Empty, string.Empty,
    node, string.Empty);
  5. 更改 Node 的构造函数的参数顺序。
  6. 在项目设置的代码契约(Contract)设置 Pane 中选中“显示假设”选项。

我是否遗漏了一些明显的东西,或者这只是静态检查器中的一个错误?


我的设置:

我的输出:

C:\{path}\Program.cs(20,9): message : CodeContracts: Suggested ensures: Contract.Ensures(this._foo != null);
C:\{path}\Program.cs(41,17): message : CodeContracts: Suggested ensures: Contract.Ensures(Contract.Result<System.String>() == this._foo);
C:\{path}\Program.cs(33,13): message : CodeContracts: Suggested ensures: Contract.Ensures(Contract.Result<ConsoleApplication3.Program+Node>() == null);
C:\{path}\Program.cs(27,13): message : CodeContracts: Suggested ensures: Contract.Ensures(Contract.Result<System.Object>() != null);
C:\{path}\Program.cs(55,13): message : CodeContracts: Suggested ensures: Contract.Ensures(Contract.ForAll(0, args.Length, __k__ => args[__k__] != 0));
CodeContracts: ConsoleApplication3: Validated: 92,3%
CodeContracts: ConsoleApplication3: Contract density: 1,81
CodeContracts: ConsoleApplication3: Total methods analyzed 8
CodeContracts: ConsoleApplication3: Methods with 0 warnings 7
CodeContracts: ConsoleApplication3: Total method analysis read from the cache 8
CodeContracts: ConsoleApplication3: Total time 2,522sec. 315ms/method
CodeContracts: ConsoleApplication3: Retained 0 preconditions after filtering
CodeContracts: ConsoleApplication3: Inferred 0 object invariants
CodeContracts: ConsoleApplication3: Retained 0 object invariants after filtering
CodeContracts: ConsoleApplication3: Detected 0 code fixes
CodeContracts: ConsoleApplication3: Proof obligations with a code fix: 0
C:\{path}\Program.cs(27,13): warning : CodeContracts: invariant unproven: _foo != null
C:\{path}\Program.cs(49,13): warning : + location related to previous warning
C:\windows\system32\ConsoleApplication3.exe(1,1): message : CodeContracts: Checked 13 assertions: 12 correct 1 unknown
CodeContracts: ConsoleApplication3:
CodeContracts: ConsoleApplication3: Background contract analysis done.

最佳答案

这不再是 the latest version 的问题.

关于c# - "Invariant unproven"使用在返回语句中创建特定新对象的方法时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14958107/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com