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.
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'. –
"CanBeNull" nie jest ich wynalazkiem. Jest częścią C#. –
W takim przypadku prawdopodobnie powinieneś poprosić zespół BCL o poradę. –