2013-10-31 7 views
16

Niedawno zorientowałem się, że można użyć adnotacji [CanBeNull] w języku C#, aby powiedzieć ReSharper (i innym dodatkom), że metoda może zwrócić wartość null. To jest świetne, ponieważ sprawia, że ​​ReSharper przypomina mi, kiedy nie radzę sobie z tymi sytuacjami.CanBeNull i ReSharper - używając go z asynchronicznymi zadaniami?

Jednak dla metody async zwracającej wartość Task lub Task<T> zachowanie jest nieoczekiwane.

Na przykład, rozważmy następujący przykład:

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

Wiem, że ten scenariusz jest nieco dziwne, ale dla uproszczenia, pokrywa się ze mną. Jeśli I (z włączonym programem ReSharper) spróbuję wywołać metodę w innym miejscu, ostrzeże ona niepoprawnie. Na przykład:

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

Tutaj, ReSharper ostrzega mnie w niewłaściwym miejscu. Pierwszy wiersz generuje ostrzeżenie (i twierdzi, że samo zadanie może w rzeczywistości mieć wartość zerową, co jest błędne). Druga linia nie generuje ostrzeżenia, które powinno być ostrzeżeniem.

Gdybym całkowicie zgodne z ReSharper, kod ten będzie musiał być napisane:

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. 

} 

Jest to błąd z ReSharper, że powinienem złożyć? Czy nieprawidłowo używam adnotacji? Sądzę, że wszyscy możemy się zgodzić, że samo zadanie nie może być nigdy null, więc nie wiem, jak to ma sens.

+1

i zaleca, aby przedstawić ją jako błąd, aby ponownie # (historycznie, były powolne, aby pracować z 'async', a oni wciąż masz wiele dziwactw, jeśli używasz 'async' w PCL) Mogą one nie być w stanie zmienić' CanBeNull', ale powinny przynajmniej móc stworzyć 'CanBeNullAsync'. –

+0

"CanBeNull" nie jest ich wynalazkiem. Jest częścią C#. –

+0

W takim przypadku prawdopodobnie powinieneś poprosić zespół BCL o poradę. –

Odpowiedz

23

Ivan Serduk powiedział: „Począwszy od ReSharper 9.2 EAP4 atrybuty [ItemCanBeNull] i [ItemNotNull] mogą być stosowane do jednostek typu«zadanie»i«lazy» . działa idealnie!

PS Proszę nie zapomnij zaktualizować JetBrains adnotacje.

Powiązane problemy