2017-06-20 39 views
7

Mam metodę rozszerzenia:Jak mogę uzyskać resharper, aby wiedzieć, że moja zmienna nie ma wartości null, po wywołaniu metody rozszerzenia?

public static bool Exists(this object toCheck) 
{ 
    return toCheck != null; 
} 

jeśli mogę użyć go, a następnie zrobić coś takiego:

if (duplicate.Exists()) 
    throw new Exception(duplicate); 

następnie resharper ostrzega mnie, że nie jest możliwe wyjątek odniesienia NULL.

Wiem, że nie jest to możliwe, ale jak mogę powiedzieć Resharper, że to jest w porządku?

Odpowiedz

4

Możesz to zrobić za pomocą adnotacji kontraktowych, ale sposób dostarczony w innej odpowiedzi nie działa dla mnie (to znaczy - nadal generuje ostrzeżenie). Ale ten działa:

public static class Extensions { 
    [ContractAnnotation("null => false; notnull => true")] 
    public static bool Exists(this object toCheck) { 
     return toCheck != null; 
    } 
} 

Aby uzyskać ContractAnnotationAttribute - zalecanym sposobem jest zainstalowanie JetBrains.Annotations pakiet Nuget. Jeśli nie chcesz instalować pakietu - przejdź do Resharper> Opcje> Adnotacje kodu i naciśnij przycisk "skopiuj implementację do schowka", a następnie wklej go w dowolnym miejscu w projekcie (upewnij się, że nie zmieniasz przestrzeni nazw).

+0

Dzięki. Czy te adnotacje można zastosować bez modyfikowania kodu lub korzystania z biblioteki programu Resharper? - Sam Holder właśnie teraz edytuj dodaj komentarz –

+0

Dzięki! to świetnie –

+0

Zaktualizowałem swoją odpowiedź z informacją o tym, że nie używam pakietu nuget. Jeśli chodzi o "bez modyfikowania kodu źródłowego" - nie wiesz, co masz na myśli, musisz zastosować ten atrybut, więc ta część kodu źródłowego powinna zostać zmodyfikowana (ale nie wydaje się problemem). Kod źródłowy, który _uses_ ta metoda nie powinien być w żaden sposób modyfikowany. – Evk

3

Możesz użyć "Contract Annotation Syntax", aby wskazać Resharperowi, że metoda nie powraca normalnie w pewnych okolicznościach, np. gdy parametr ma wartość NULL.

Dla przykładu można zrobić coś takiego:

[ContractAnnotation(toCheck:notnull => true] 
public static bool Exists(this object toCheck) 
{ 
    return toCheck != null; 
} 

Jeżeli toCheck:null => true ReSharper mówi, że jeśli toCheck nie jest null, metoda zwróci true.

[EDYCJA] Zaktualizowano link do najnowszej dokumentacji programu Resharper.

+0

Dzięki. Czy te adnotacje można zastosować bez modyfikowania kodu lub korzystania z biblioteki programu Resharper? –