2017-09-22 33 views
-1

Ce code d'une classe de mine avec une coutume indexer:Un paramètre d'indexeur peut-il être nul?

public string this[string key] 
{ 
    get => /* ... */; 
    set 
    { 
     if (key != null) doSomething(key, value); 
    } 
} 

Maintenant, ReSharper souligne le chèque et dit key != null:

L'expression est toujours vrai.

Bien que je pense que ReSharper est correct ici, je ne peux pas comprendre pourquoi.

Peut-être que the language spec impose cela?

Ma question:

un paramètre indexeur peut-il jamais être nul?

Mise à jour 1:

Avant de supprimer ma question à cause de moi étant trop bête, juste une note expliquant pourquoi ReSharper a écrit l'avertissement:

Je tirais ma classe de IDictionary<TKey, TValue> qui semble être annoté par ReSharper ne doit pas avoir null pour le paramètre indexeur.

Ainsi, l'avertissement. Désolé de poster une telle non-question.

+5

_ "Je crois que ReSharper est correct ici" _ - pourquoi croyez-vous cela? il aurait été assez facile pour vous de vérifier, et vous auriez trouvé que non. Cela suppose, bien sûr, que vous nous ayez montré tous les détails pertinents. –

+2

R # semble être incorrect ici. Cependant un indexeur * ne devrait pas être nul, mais sûrement il peut *. – HimBromBeere

+0

Bon point, @PeterDuniho Dois-je supprimer ma question ici? –

Répondre

1

Vous ne savez pas pourquoi ReSharper semble si sûr que l'expression est toujours vraie, puisque pouvez passer null à un indexeur. Cependant, si vous avez deux indexeurs qui acceptent les types de référence, l'indexation de null sera ambigu à moins que la valeur null ne soit castée. Peut-être que ReSharper ne tient pas compte du fait que vous pouvez toujours lancer null, et donc suppose à la place que vous ne pouvez jamais passer null à un indexeur, qui, encore une fois, a été montré pour être faux.

+0

Je viens d'ajouter une mise à jour à ma question. Semble être parce que je dérive de 'IDictionary '. –

+2

@Uwe Keim: Ah, donc ReSharper n'émet pas d'avertissement lorsque votre type n'implémente pas IDictionary <,>? Si oui, je vais supprimer ma réponse et vous pouvez répondre moi-même, bien que cela laisse toujours la question de savoir si votre question devrait avoir un MCVE (et si c'était le cas, vous auriez sûrement repéré l'erreur). – BoltClock

+0

Oui, juste vérifié. Lorsqu'il ne dérive pas de 'IDictionary ', aucun avertissement ne se produit. –