如何在使用 Contract.Ensures() 声明非空序列的返回时避免 Resharper 警告?

4

我正在使用代码合同来声明一个属性返回一个非空的、非空序列的字符串,如下所示:

public IEnumerable<string> Filenames
{
    get
    {
        Contract.Ensures(Contract.Result<IEnumerable<string>>() != null);

        // Next line gives Resharper Warning
        // "Possible null assignment to entity marked with 'not null' attribute":

        Contract.Ensures(Contract.Result<IEnumerable<string>>().Any());

        return new []{"TEST"}; // Dummy data for demo purposes.
    }
}

我在Resharper中遇到了上面代码注释中描述的警告。

这类似于这里的问题:,但我已经尝试应用答案中的修复方法,但并不能解决这个特定问题。

有人知道如何解决这个问题吗(除了使用Resharper注释来抑制警告)?

我正在使用Resharper 7.1.2 C#版,版本号为7.1.2000.1478。

(我已经在几台机器上检查过了,所有机器都出现了这个问题。这是R#的原始安装 - 我们没有修改任何XML文件,除了我尝试应用上面链接的答案中的修复方法之外。)

进一步的信息:

我正在尝试在带有.NET 4.0和.NET 4.5的Visual Studio 2012 Update 2中完成此操作。

另外,您需要将条件编译符号“CONTRACTS_FULL”添加到项目的生成设置中(在“条件编译符号”文本框中)。


你使用的是哪个 R# 版本?我没有收到这样的警告,我使用的是 ReSharper 7.1 和 StyleCop 插件。 - Ilya Ivanov
好的,谢谢指出。是7.1版本。我会更新我的问题,并检查我的同事们的电脑。 - Matthew Watson
请贴出一个XML片段,您试图将其添加到ReSharper的注释中。 - Dmitry Osinovskiy
我也遇到了这个问题。使用的是.Net 4.5和VS2012.2专业版以及完整版的ReSharper 7.1.3 - 看起来它根本没有检测到Contracts.Ensures(但是Contracts.Requires是被尊重的)。顺便说一下,我在最新的ReSharper v8 EAP中检查了ExternalAnnotations,它们仍然是一样的... - Nikola Bogdanović
我更新了我的答案,并在另一个问题中得到了ReSharper专家的确认。 - Nikola Bogdanović
1个回答

1
问题在于,尽管大多数代码合同都包含在ReSharper ExternalAnnotations中,但Ensures不是其中之一(甚至没有任何浮动的自定义xml中)。
我刚刚检查了最新的ReSharper v8 EAP的ExternalAnnotations,它们仍然与v7.1.3完全相同-因此到目前为止绝对没有任何变化。
我将提出一个新问题,询问是否有人知道如何实现它。 更新: ReSharper ExternalAnnotations的Code Contracts Ensures 最终:根本无法做到-因为该属性需要以某种方式暗示包含代码合同的方法,而不是代码合同本身的内容...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接