Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 代码合同不';VS2012似乎不起作用_C#_.net_Visual Studio 2012_Code Contracts - Fatal编程技术网

C# 代码合同不';VS2012似乎不起作用

C# 代码合同不';VS2012似乎不起作用,c#,.net,visual-studio-2012,code-contracts,C#,.net,Visual Studio 2012,Code Contracts,我正在阅读代码契约,乍一看它似乎是相当革命性的,但我似乎无法让它们正常工作。我正在运行Windows 8和Visual Studio 2012 Premium(两者的发布版本)。然后,我通过单击“下载代码契约”链接从安装代码契约 然后,我在一个全新的控制台应用程序中编写了以下代码: class Program { static void Main(string[] args) { var answer = Add(0, 5); Console.Write(an

我正在阅读代码契约,乍一看它似乎是相当革命性的,但我似乎无法让它们正常工作。我正在运行Windows 8和Visual Studio 2012 Premium(两者的发布版本)。然后,我通过单击“下载代码契约”链接从安装代码契约

然后,我在一个全新的控制台应用程序中编写了以下代码:

class Program
{
   static void Main(string[] args)
   {
      var answer = Add(0, 5);
      Console.Write(answer);

      Console.ReadLine();
   }

   static int Add(int x, int y)
   {
      Contract.Requires(x > 0 && y > 0);

      return x + y;
   }
}
我预计编译会失败,因为
Add
的第一个参数是0,但程序成功并将5输出到控制台

我试过使用默认的代码契约设置,也尝试过一些东西,但都没有用。我的当前设置如下所示:

知道我做错了什么吗

更新:

以下是构建窗口的结果。它似乎在做些什么,但只是发出警告而不是错误。在我观看的视频中,这些东西被标记为编译错误,程序甚至无法运行

1>------ Build started: Project: DeleteMe, Configuration: Debug Any CPU ------
1>  DeleteMe -> c:\users\mike\documents\visual studio 2012\Projects\DeleteMe\DeleteMe\bin\Debug\DeleteMe.exe
1>  CodeContracts: Task manager is unavailable.
1>  CodeContracts: DeleteMe: Run static contract analysis.
1>  CodeContracts: Suggested requires: Contract.Requires(false);
1>  CodeContracts: DeleteMe: Validated:  0.0 %
1>  CodeContracts: DeleteMe: Contract density: 0.87
1>  CodeContracts: DeleteMe: Total methods analyzed 4
1>  CodeContracts: DeleteMe: Methods with 0 warnings 3
1>  CodeContracts: DeleteMe: Total time 4.974sec. 1243ms/method
1>  CodeContracts: DeleteMe: Methods with necessary preconditions: 1
1>  CodeContracts: DeleteMe: Discovered 1 new candidate preconditions in 00:00:00.1718843
1>  CodeContracts: DeleteMe: Retained 1 preconditions after filtering
1>  CodeContracts: DeleteMe: Inferred 0 object invariants
1>  CodeContracts: DeleteMe: Retained 0 object invariants after filtering
1>  CodeContracts: DeleteMe: Detected 0 code fixes
1>  CodeContracts: DeleteMe: Proof obligations with a code fix: 0
1>c:\Users\Mike\Documents\Visual Studio 2012\Projects\DeleteMe\DeleteMe\Program.cs(14,10,14,33): warning : CodeContracts: requires is false: x > 0 && y > 0
1>c:\Users\Mike\Documents\Visual Studio 2012\Projects\DeleteMe\DeleteMe\Program.cs(22,10,22,44): warning : CodeContracts: location related to previous warning
1>  CodeContracts: Checked 1 assertion: 1 false
1>  CodeContracts: DeleteMe: 
1>  CodeContracts: DeleteMe: Static contract analysis done.
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

因此,问题似乎是一些限制和代码契约的陷阱的组合。希望这个答案能帮助像我这样刚刚起步的人

首先,自构建1.4.50327.0以来,代码契约确实支持Visual Studio 2012(除Express之外的任何版本),但如果您的构建早于1.4.50910.0,则必须运行devenv.exe/setup。有关更多信息,请参阅

我遇到的第一个问题是在代码契约属性选项卡的“静态检查”部分选中了“缓存结果”复选框。默认情况下,此选项处于启用状态,并且还需要SQL Server CE存储其缓存数据,而Windows 8、VS2012或代码契约未安装该数据。不幸的是,您的程序将继续正常编译,您必须手动查看构建输出以查看错误:

CodeContracts:xxx:未处理的异常: System.IO.FileNotFoundException:无法加载文件或程序集 'System.Data.SqlServerCe,版本=3.5.1.0,区域性=中性, PublicKeyToken=89845dcd8080cc91'或其依赖项之一。这个 系统找不到指定的文件

取消选中“缓存结果”复选框将解决此问题,安装SQLServerCE也是如此

第二个问题是,违反规范合同的行为被视为一种行为。即使启用了“将警告视为错误”,程序仍将继续编译并成功运行。如果您有一个较大的项目,其中有大量被忽略的警告,那么可能很难注意到这些新的代码契约警告。在中,这些警告也反映在VisualStudioIDE中(调用代码有一个蓝色下划线),但是我在VisualStudio2012中似乎没有看到这种行为

这个设计决定令我不安。如果我在我的代码中定义了一个契约,一个函数必须接受一个大于0的整数,并且我明目张胆地传入了一个0,这是一个错误。不是警告。我很明显地违反了那份合同


总的来说,我认为代码契约非常强大,可能会改变我们测试软件的方式。MS Research确实做了很好的工作。然而,我认为它还没有真正为主流做好准备。它需要一些调整才能开始工作,它不能无缝地集成到VisualStudio构建过程中,而且速度也相当慢。在较小的项目上,它按预期工作,但当我将其插入到较大的项目中时,花了整整十分钟来分析所有代码。

先生,您必须启用运行时检查。在您的窗口下,以图像的形式发布

“满”表示将检查所有条件。 其余的都是不言自明的

  • 静态检查只在后台运行,并检查代码中可以改进的任何内容。小心-这会使您的构建速度有所降低

您是否尝试将警告级别滑块移动到“hi”位置?可能是因为它需要更高的警告级别才能导致编译错误。@TyCobb-是的,我试着把它移到右边。没有效果。@TyCobb-而且,你可能会认为即使它们只是警告,我仍然会在IDE中看到扭曲的下划线。我认为代码契约与VS2012不兼容,或者更新还没有发布。是的,可能是它的兼容性问题。我在你提供的链接上观看了视频,他甚至说它会导致编译错误,但后来意识到它不能也不会在演示中出现,所以我不再期待编译错误。然而,你至少应该得到一些警告和扭曲,因为你已经检查过了。我同意你的看法,认为只需要发布更新。还有,这里是这样的:听起来对他们来说太多工作了。你安装了ReSharper吗?我在你的第一篇文章中尝试了这个例子,但没有让曲线出现。在挂起ReSharper、关闭VS、从项目中删除bin和obj文件夹,然后重新打开VS之后,我可以让静态检查按预期工作,并在调用
Add(0,5)
下显示一条曲线。然后我启用了ReSharper,静态检查仍能正常工作。@WarrenG-我确实安装了ReSharper!但是,我挂起了它,关闭了VS,删除了bin/obj文件夹,然后重新打开VS,加载了项目,构建了解决方案,但仍然没有扭曲。哦,好吧,我刚刚用最新更新的VS2012的新安装尝试了这一点。仅安装nuget、windows library for js的库扩展和nuget。我仍然收到任务管理器无效错误。所以这里有一些更微妙的东西???@Gordon-是的,这项技术在我看来很脆弱,需要很多调整才能开始工作。事实上,我只是停止使用它,我会等到它变得更主流一点。@Mike,是的,我也得出了类似的结论。目前,我正在考虑在teamcity构建项目时启用这些功能,但在调试和测试过程中