CanBeNull и ReSharper - используя его с асинхронными задачами?

Недавно я выяснил, что вы можете использовать аннотацию [CanBeNull] в С#, чтобы сообщить ReSharper (и другим аддонам), что метод может вернуть null. Это здорово, потому что это заставляет ReSharper напоминать мне, когда я не обрабатываю эти ситуации.

Однако для async методов, возвращающих Task или Task<T>, поведение неожиданно.

Например, рассмотрим этот пример:

[CanBeNull]
public async Task<string> GetSomeName() {
    var time = DateTime.Now;
    if(time.Second == 30) { 
        return "Jimmy"; 
    } else {
        return null;
    }
}

Я знаю, что этот сценарий немного странный, но для простоты, несите меня. Если я (с включенным ReSharper), то попытайтесь вызвать метод в другом месте, он предупреждает неправильно. Например:

var myValue = await GetSomeName();
var subValue = myValue.Trim(); //here, ReSharper should warn me that subValue is null.

Здесь ReSharper предупреждает меня в неправильном месте. Первая строка генерирует предупреждение (и утверждает, что сама задача может быть нулевой, что неверно). Вторая строка не генерирует предупреждение, в котором должно быть предупреждение.

Если бы я полностью подчинялся ReSharper, этот код должен был бы быть написан:

var myTask = GetSomeName();
if(myTask != null) { 
    //this is silly, and is always true, but ReSharper thinks that the Task can be null due to the CanBeNull attribute.

    var myValue = await myTask;
    var subValue = myValue.Trim(); //this could generate an error, but ReSharper doesn't warn me.

}

Это ошибка с ReSharper, которую я должен отправить? Или я использую аннотацию неправильно? Думаю, мы все можем согласиться с тем, что сама задача никогда не может быть null, поэтому я не знаю, как это имеет смысл.

Ответы

Ответ 1

Иван Сердюк сказал: "Начиная с атрибутов ReSharper 9.2 EAP4 [ItemCanBeNull] и [ItemNotNull] можно применить к объектам типа" Задача "и" Лень ". Он отлично работает!

P.S Пожалуйста, не забудьте обновить аннотации Jetbrains.

Ответ 2

Вы столкнулись с ограничением анализа нулевого значения ReSharper. Он пытается рассматривать возвращаемое значение (задание) как потенциальное значение null, а не результат. Тем не менее, этот отличный запрос функции - я предлагаю голосовать за эту проблему: http://youtrack.jetbrains.com/issue/RSRP-376091