2013-10-31 29 views
16

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.

+1

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. –

+0

Well CanBeNull onların icadı değil. Bu C# nin bir parçası. –

+0

Bu durumda, muhtemelen BCL ekibine rehberlik etmesini istemelisiniz. –

cevap

23

Ivan Serduk söyledi: Task 've 'Lazy' "ReSharper 9.2 EAP4 [ItemCanBeNull] nitelikleri ve [ItemNotNull] tipi kuruluşlara uygulanabilir başlayarak' . mükemmel çalışıyor!

PS JetBrains Ek Açıklamalar güncellemeyi unutmayın lütfen. Ben tarihsel, onlar async` `çalışmak yavaş (# Re bir hata olarak teslim ve onlar tavsiye

7

ReSharper'ın boş değer analizi sınırlamasına maruz kaldınız. Sonuçtan ziyade dönüş değerini (görev) potansiyel sıfır olarak ele almaya çalışıyor. Ancak, bu harika bir özellik isteği - Ben bu sorun için oylama öneririm: http://youtrack.jetbrains.com/issue/RSRP-376091

İlgili konular