Comment est-ce Dictionnaire<TKey, TValue> à l'exception possible?
Le suivant trace de la pile:
MESSAGE: Value cannot be null.Parameter name: key
SOURCE: mscorlib
TARGETSITE: Void ThrowArgumentNullException(System.ExceptionArgument)
STACKTRACE:
at System.ThrowHelper.ThrowArgumentNullException(ExceptionArgument argument)
at System.Collections.Generic.Dictionary'2.FindEntry(TKey key)
at System.Collections.Generic.Dictionary'2.get_Item(TKey key)
at MyCompany.MAF.Agent.ServiceContracts.ConvertUtils.Convert(Dictionary'2 from) in D:\Development\MAF\Agent\MyCompany.MAF.Agent\ServiceContracts\ConvertUtils.cs:line 11
J'en conclus que, en quelque sorte, le bloc de code suivant a récupéré une valeur null à partir de l'entrée de Dictionnaire Clés de la collection. Cependant, le dictionnaire de saisie est une instance de Dictionary<string, string>
. La mise en œuvre de Dictionary<string, string>
fait que la condition impossible. Lors de l'ajout d'un élément avec une clé null, une exception est levée.
internal static KeyValuePair<string, string>[] Convert(IDictionary<string, string> from)
{
List<KeyValuePair<string, string>> ret = new List<KeyValuePair<string, string>>();
foreach (string key in from.Keys)
ret.Add(new KeyValuePair<string, string>(key, from[key]));
return ret.ToArray();
}
- Depuis il n'a pas vraiment répondre à votre question (ma meilleure supposition est que ce fil), mais votre boucle qui se répète d'.ToArray() permet d'obtenir le même résultat
Vous devez vous connecter pour publier un commentaire.
J'ai eu ce problème se produit souvent parce que j'ai fait une erreur en permettant à plusieurs threads d'accéder à la même dictionnaire. Assurez-vous que ce n'est pas le cas, parce que
Dictionary
n'est pas thread-safe.(Soit dit en passant, votre méthode peut être grandement simplifiée.
Dictionary<K,V>
est déjà unIEnumerable<KeyValuePair<K,V>>
. Vous devriez être en mesure de faire deToArray
sur un.Dictionary
pouvez toujours jeter cette exception lors de l'entrée dans certains états. Je l'ai vu arriver beaucoup de choses, en particulier lors de l'utilisation sans protection statique de dictionnaires dans mon ASP.NET des applications.On dirait que votre
IDictionary
argument a un élément avec unKey
paramètre est null.La vérification des paramètres pour la
IDictionary
sera probablement se passe quelque part en interne dans le cadre.Cette exception se produit si la clé de dictionnaire est
null
. Construit-dansDictionary
classe ne permet pas de telles clés, vous pourriez être en utilisant votre propreIDictionary
-compatible classe qui permetnull
.Pas sûr de la valeur null mais pourquoi n'êtes-vous pas à l'aide de:
Edit: autant Que les valeurs null sont concernés. Avez-vous plusieurs threads accèdent à ce IDictionary? La Corruption est possible si vous n'êtes pas thread-safe. Voir ce post pour un exemple de la corruption dans le
classe. Comment puis-je modifier une file d'attente de la collection dans une boucle?
Filetage pourrait bien être la cause, mais c'était un leurre dans notre cas. Vous pouvez également semblent à avoir ce problème si vous avez un Communiqué de construire où une fonction inline. Considérer cette repro:
Sur ma machine ce qui donne la suite de Debug trace de la pile:
Mais, il donne ce trace de pile dans Communiqué de construire:
Vous seriez tentés de penser qu'avec la dernière trace de la pile qu'il a être
things.TryGetValue
qui provoque l'exception, alors qu'en fait, il était laSomeSeeminglyUnrelatedFunction
fonction qui l'a incorporé dansMain
.Si vous atterrissez ici, veuillez prendre en considération si vous avez un problème similaire. (Je réalise que j'ai peut-être pas un droit en haut de répondre à l'OP de la question, mais je voulais partager néanmoins que cela pourrait aider un futur visiteur.)
Pourrait-il possible qu'un autre thread affecte la dirctionary transmis dans Convertir?