Почему аннотированные интерфейсы Resharper / Jetbrains [NotNull] предупреждают меня об исключениях nullreference? - PullRequest
0 голосов
/ 09 января 2019

Я пытаюсь пройти через мой проект и аннотировать все свои методы соответствующими аннотациями 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 явно не нравятся. Тем не менее, когда я пробую это с реализацией этого интерфейса вместо этого - не проблема.

Это действительно немного раздражает. Я не хочу, чтобы весь мой код шатался сейчас. По-видимому, это также является проблемой только при работе с кодом await / async, поскольку это работает в обоих случаях, если я опущу, например, «await», но это не вариант.

Есть ли решение? В конце концов, что может отсутствовать в интерфейсе R #, который есть в реализации? Определение метода здесь.

EDIT:

Для дополнительной информации:

Я использую Resharper Ultimate 2018.3.1 в Visual Studio Enterprise 2017 версии 15.6.1.

1 Ответ

0 голосов
/ 11 января 2019

Реализация (TestClass.TestMethod) - это асинхронный метод, который возвращает экземпляр Task и никогда не возвращает null. Подпись метода интерфейса «ITestClass.TestMethod» не гарантирует, что результат не является нулевым (вы можете реализовать его с помощью неасинхронного метода, который просто возвращает нулевое значение). Таким образом, в «пессимистическом» режиме анализа ReSharper предполагает, что «ITestClass.TestMethod» может возвращать ноль. Чтобы исправить это, вы можете добавить аннотацию NotNull в метод интерфейса:

public interface ITestClass
{
    [NotNull] Task<int?> TestMethod([CanBeNull] int? testInput);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...