我有以下软件:
当我打开一个包含代码契约的方法时,ReSharper对合同感到困惑:
警告我chapter
可以为空,即使合同要求它不是。也:
合约不变方法标记为never used
。技术上是正确的,但它不应该告诉我,因为代码合同重写器使用该方法来获取有关每个不变量的信息。我如何教授ReSharper关于代码合同以纠正这两个问题?
答案 0 :(得分:3)
要使其适用于Portable Class Library,请执行以下操作:
在ExternalAnnotations
目录中创建新文件夹C:\Program Files (x86)\JetBrains\ReSharper\v8.2\Bin\
;
将System.Diagnostics.Contracts.xml
放在其中,内容如下:
<assembly name="System.Diagnostics.Contracts">
<member name="M:System.Diagnostics.Contracts.Contract.Assume(System.Boolean)">
<attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
<argument>condition:false=>halt</argument>
</attribute>
</member>
<member name="M:System.Diagnostics.Contracts.Contract.Assume(System.Boolean,System.String)">
<attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
<argument>condition:false=>halt</argument>
</attribute>
</member>
<member name="M:System.Diagnostics.Contracts.Contract.Assert(System.Boolean)">
<attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/>
<attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
<argument>condition:false=>halt</argument>
</attribute>
</member>
<member name="M:System.Diagnostics.Contracts.Contract.Assert(System.Boolean,System.String)">
<attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/>
<attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
<argument>condition:false=>halt</argument>
</attribute>
</member>
<member name="M:System.Diagnostics.Contracts.Contract.Requires(System.Boolean)">
<attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
<argument>condition:false=>halt</argument>
</attribute>
</member>
<member name="M:System.Diagnostics.Contracts.Contract.Requires(System.Boolean,System.String)">
<attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
<argument>condition:false=>halt</argument>
</attribute>
</member>
<member name="M:System.Diagnostics.Contracts.Contract.Requires``1(System.Boolean)">
<attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
<argument>condition:false=>halt</argument>
</attribute>
</member>
<member name="M:System.Diagnostics.Contracts.Contract.Requires``1(System.Boolean,System.String)">
<attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
<argument>condition:false=>halt</argument>
</attribute>
</member>
<member name="M:System.Diagnostics.Contracts.Contract.Invariant(System.Boolean)">
<attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/>
<attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
<argument>condition:false=>halt</argument>
</attribute>
</member>
<member name="M:System.Diagnostics.Contracts.Contract.Invariant(System.Boolean,System.String)">
<attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/>
<attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
<argument>condition:false=>halt</argument>
</attribute>
</member>
<member name="M:System.Diagnostics.Contracts.Contract.ReportFailure(System.Diagnostics.Contracts.ContractFailureKind,System.String,System.String,System.Exception)">
<attribute ctor="M:JetBrains.Annotations.AssertionMethodAttribute.#ctor"/>
<attribute ctor="M:JetBrains.Annotations.ContractAnnotationAttribute.#ctor(System.String)">
<argument>=>halt</argument>
</attribute>
</member>
<member name="T:System.Diagnostics.Contracts.ContractInvariantMethodAttribute">
<attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
</member>
<member name="T:System.Diagnostics.Contracts.ContractClassForAttribute">
<attribute ctor="M:JetBrains.Annotations.MeansImplicitUseAttribute.#ctor" />
</member>
</assembly>
关闭所有Visual Studio实例(只是为了让ReSharper有机会重新加载注释),重新打开Visual Studio并加载所需的解决方案;
您可能需要清理ReSharper缓存(ReSharper |选项|环境|常规|清除缓存);
我还提交了a new ticket关于在ReSharper ExternalAnnotations扩展中支持此类案例的默认情况。
答案 1 :(得分:2)
我已经通过电子邮件支持与JetBrains签订合同,突然意识到了这一点。我正在使用便携式类库解决方案。我会附上我这边的电子邮件来回答这个问题,并会对那些可能在此时遇到类似问题的人提供后续回复(如果有的话)。
感谢您的快速回复。我现在安装了8.2.1000.4556和 将ExternalAnnotations扩展更新为8.2.1001。该 上述&#34; ReSharper代码合同1.0.0&#34;插件实际上是 叫&#34; ReSharper.ContractExtensions 0.7.51&#34;在插件页面上。我是 使用.NET 4.5,我没有定义编译符号也没有 引用任何与代码契约相关的库。
然而,我似乎忽略了提到我在工作 便携式类库项目。因为我没有想到这一点 可能性,我创建了一个测试我的ReSharper的测试项目 安装用。我使用了常规项目和Portable Class 图书馆项目。结果对你来说可能并不奇怪:一切 在常规项目中按预期工作,但代码合同不是 在便携式类库中得到认可。
因此很容易得出结论,尚未得到支持 便携式类库,或者这只是没有的东西 经过测试。我已将测试项目附加到此电子邮件中。如果你 打开&#34; Class1.cs&#34;文件在&#34; ClassLibrary1&#34;来自VS2013的项目 使用ReSharper 8.2.1更新2,您应该看到与我相同的警告 做。
我希望您考虑添加对这些项目类型的支持。我可以 只是想象一下,在支持中出现问题 检测,但唉,我不知道你的代码库,我也不应该尝试 猜测。我只希望你会考虑这个功能。