Kısa süre önce, bir yöntemin sıfırlayabileceği ReSharper (ve diğer eklentiler) için C# 'deki [CanBeNull]
ek açıklamasını kullanabileceğinizi öğrendim. Bu harika, çünkü bu durumlarla baş edemediğimde ReSharper'ın bana hatırlatmasını sağlıyor. Ancak, Task
veya Task<T>
döndüren async
yöntemleri için davranış beklenmedik olur. Benimle, ayıCanBeNull ve ReSharper - bunu uyumsuz Görevler ile mi kullanıyorsunuz?
[CanBeNull]
public async Task<string> GetSomeName() {
var time = DateTime.Now;
if(time.Second == 30) {
return "Jimmy";
} else {
return null;
}
}
Bu senaryo biraz garip olduğunu biliyorum, ama basitlik için:
Örneğin, bu örneği düşünün. Eğer (ReSharper etkinken) I, başka bir yerde yöntemi çağırmaya çalışırsa, yanlış uyarır. Örneğin: ReSharper yanlış yerde beni uyarır. İlk satır bir uyarı üretir (ve bu, görevin gerçekte boş olabileceğini iddia eder, bu da yanlıştır). İkinci satır, uyarının oluşturulmadığı bir uyarı üretmez. Tamamen ReSharper uymak için olsaydı
bu kod yazılmak zorunda olacaktır:
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.
}
bu ben sunmalıdır ReSharper ile bir hata mı? Yoksa ek açıklama yanlış mı kullanıyorum? Sanırım hepimiz görevin kendisinin asla null
olamayacağı konusunda hemfikir olabiliriz, bu yüzden nasıl mantıklı olduğunu bilmiyorum.
Eğer bir PCL'de '' async' '' kullanırsanız hala çok fazla tuhaflık var. 'CanBeNull'ı değiştiremeyebilirler, fakat en azından bir' CanBeNullAsync 'oluşturabilmeleri gerekir. –
Well CanBeNull onların icadı değil. Bu C# nin bir parçası. –
Bu durumda, muhtemelen BCL ekibine rehberlik etmesini istemelisiniz. –