2017-06-20 2 views
7

J'ai une méthode d'extension:Comment puis-je faire savoir à resharper que ma variable n'est pas NULL après avoir appelé une méthode d'extension?

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

si je l'utilise et faire quelque chose comme ceci:

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

alors ReSharper me met en garde contre qu'il ya une exception de référence null possible.

Je sais que ce n'est pas possible, mais comment puis-je dire à resharper que c'est ok?

Répondre

4

Vous pouvez le faire avec des annotations de contrat, mais la manière fournie dans une autre réponse ne fonctionne pas pour moi (c'est-à-dire - produit toujours un avertissement). Mais celui-ci fonctionne:

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

Pour ContractAnnotationAttribute - méthode recommandée est d'installer JetBrains.Annotations package NuGet. Si vous ne voulez pas installer le paquet - allez dans Resharper> Options> Annotations de code et appuyez sur le bouton "Copier l'implémentation dans le presse-papiers", puis collez-le n'importe où dans votre projet (assurez-vous de ne pas changer d'espace de nom).

+0

Merci. Ces annotations peuvent-elles être appliquées sans modifier le code ou en utilisant une bibliothèque de resharper? - Sam Holder juste maintenant éditer ajouter un commentaire –

+0

Merci! C'est génial –

+0

J'ai mis à jour ma réponse avec des informations sur ne pas utiliser leur paquet nuget. Comme pour "sans modifier le code source" - je ne sais pas ce que vous voulez dire, vous devez appliquer cet attribut, donc cette partie du code source doit être modifiée (mais ne semble pas être un problème). Le code source qui utilise cette méthode ne devrait cependant pas être modifié. – Evk

3

Vous pouvez utiliser "Contract Annotation Syntax" pour indiquer à Resharper qu'une méthode ne revient pas normalement dans certaines circonstances, par ex. quand un paramètre est nul.

Pour votre exemple, vous pouvez faire quelque chose comme ceci:

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

Lorsque le toCheck:null => true dit ReSharper que si toCheck est non nul, la méthode retourne true. [EDIT] Lien mis à jour pour pointer vers la documentation Resharper la plus récente.

+0

Merci. Ces annotations peuvent-elles être appliquées sans modifier le code ou en utilisant une bibliothèque de resharper? –