为什么Resharper / Jetbrains [NotNull]批注的接口会警告我nullreferenceexceptions?

时间:2019-01-08 21:49:36

标签: c# annotations resharper

我正在尝试完成我的项目,并用各自的Resharper / Jetbrains注释对我的所有方法进行注释,所以当我不小心尝试传递不属于某个地方的内容时,我会得到一些帮助和冲击。

但是,这是我无法理解的。

请考虑以下内容:

public interface ITestClass
{
    Task<int?> TestMethod([CanBeNull] int? testInput);
}

public class TestClass : ITestClass
{
    public async Task<int?> TestMethod(int? testInput)
    {
        return await Task.FromResult(testInput);
    }
}

public class TestConsumer
{
    [NotNull]
    private readonly ITestClass m_tester;

    [NotNull]
    private readonly TestClass m_tester2;

    public TestConsumer([NotNull] ITestClass tester, [NotNull] TestClass tester2)
    {
        m_tester = tester;
        m_tester2 = tester2;
    }

    public async Task TestMethod([NotNull] int? testInput)
    {
        var test1 = await m_tester.TestMethod(testInput);
        var test2 = await m_tester2.TestMethod(testInput);
    }
}

![enter image description here

为了显示我现在面临的问题,我对此进行了重新构建。通常,我正在使用依赖项注入,并且期望在我的构造函数中某些服务的接口(在这种情况下,让'ITestClass'是服务'TestClass'的接口)。控制器(请参见“ TestConsumer”)。

但是,R#/ Jetbrains注释显然不喜欢这样。但是,当我尝试使用该接口的实现代替时-没问题。

这确实有点烦人。我现在不想摆弄我的整个代码。显然,这在处理等待/异步代码时也只是一个问题,因为如果我不使用“等待”,这在两种情况下都适用,但这不是一种选择。

有什么解决办法吗?最后,R#在实现中的接口中可能会丢失什么?方法定义在那里。

编辑:

有关其他信息:

我正在Visual Studio Enterprise 2017 15.6.1版中运行Resharper Ultimate 2018.3.1。

1 个答案:

答案 0 :(得分:3)

实现(TestClass.TestMethod)是一个异步方法,该方法返回Task的实例,并且从不返回null。接口方法“ ITestClass.TestMethod”的签名不能保证结果不为空(您可以使用仅返回null的非异步方法来实现该结果)。因此,在“悲观”分析模式下,ReSharper假定“ ITestClass.TestMethod”可以返回null。要修复它,您可以在接口的方法中添加“ NotNull”注释:

public interface ITestClass
{
    [NotNull] Task<int?> TestMethod([CanBeNull] int? testInput);
}