2014-12-20 15 views
8

Utilizzando ReSharper 8.2 Ho ricevuto un avviso ("L'espressione è sempre falsa") per il controllo di nulla inReSharper: Null controllo è sempre falso avviso

public bool TryGetValue(TKey key, out TValue value) 
{ 
    if (key == null) 

da NHibernate NullableDictionary. Perchè è questo? Quando provo con

class Test<T> where T : class 

quindi non ottengo l'avviso per i controlli nulli sulle variabili T come previsto.

Edit: Per rendere le cose più facili qui è la firma di classe della sorgente collegata:

public class NullableDictionary<TKey, TValue> : IDictionary<TKey, TValue> where TKey : class 
+0

Lo standard 'Dictionary' genera ArgumentNullException se la chiave è nullo, ma sembra che questa implementazione permette' null' di.Ha qualcosa a che fare con l'implementazione dell'interfaccia 'IDictionary', ma non sono sicuro che ReSharper abbia ragione, o se stia facendo un'ipotesi errata. –

risposta

9

E 'che si verifica perché la classe implementa IDictionary<TKey, TValue>; l'avviso scompare se si cancella (temporaneamente) la parte dell'interfaccia della firma della classe.

Dal momento che la "chiave" nel System.Collections.Generic.Dictionary classe standard non può mai essere null (viene generata ArgumentNullException), direi che ReSharper sta facendo un presupposto errato.


Test del comportamento:

ho testato la classe in un progetto altrimenti vuoto e provato fuori. Sebbene ReSharper abbia oscurato tutto il codice, sicuramente è ancora eseguito in fase di runtime.

Il testo grigio indica ReSharper crede che la logica sarà sempre goccia attraverso al blocco else, ma non è chiaramente il caso quando lo si utilizza.

enter image description here


Una correzione, utilizzando le annotazioni:

per aggirare il problema della ReSharper supponendo di default che la chiave non può essere null, è possibile utilizzare il JetBrains annotazioni.

Aggiungere un riferimento all'assembly Annotazioni JetBrains. Per me, questa è stata la posizione:

C: \ Program Files (x86) \ JetBrains \ ReSharper \ v8.2 \ Bin \ JetBrains.Annotations.dll

quindi aggiungere una direttiva using a la parte superiore del file dove la classe è:

using JetBrains.Annotations; 

ora mark quel parametro con l'attributo CanBeNull e vedrete ReSharper non più grigi il testo:

public bool TryGetValue([CanBeNull] TKey key, out TValue value) 

enter image description here

+0

Ma in un NullableDictionary si può. Quindi immagino che ReSharper si aspetti che un attuatore di IDictionary si attenga al principio che a runtime la chiave non deve essere nulla. – user764754

+0

Aggiornato la mia risposta dopo aver provato. –

+0

@ user764754 Ho trovato un modo per aggirare anche questo, se sei interessato. –

Problemi correlati