2017-07-05 4 views
-4

Der folgende Code:'Ein Artikel mit demselben Schlüssel wurde bereits hinzugefügt.' - Welcher Schlüssel?

var rnd = new Random(); 
Enumerable.Range(1,20).Select(x => rnd.Next(10)).ToDictionary(x => x, x => ""); 

wird unweigerlich mit der folgenden Ausnahme fehlschlagen:

System.ArgumentException: 'Ein Element mit demselben Schlüssel wurde bereits hinzugefügt'

Gibt es eine Möglichkeit, die Visual Studio-IDE während des Debuggens zu verwenden, um den versuchten Schlüssel herauszufinden? Ist der Schlüssel irgendwo in den Ausnahmedetails gespeichert - vielleicht ein internes/privates Feld; Welche kann mit Ausnahmedetails Fenster gelesen werden?

Ich kann die Quelle von ToDictionary nicht ändern, um den Schlüssel in der geworfenen Ausnahme einzuschließen.

Hinweis: Ich bin mir bewusst, dass ich dies in einer debuggable Mode schreiben kann, mit einer For Each Schleife anstelle von LINQ. Aber ich frage nach dem allgemeinen Fall - wenn diese Ausnahme ausgelöst wird und der Quellcode nicht unter meiner Kontrolle ist, gibt es eine Möglichkeit, auf den Schlüssel zuzugreifen?

Verwendung der VS 2017 Community Edition.

Antwort

0

Es ist möglich, die IDE zumindest für eine System.Collections.Generic.Dictionary<TKey,TValue> zu verwenden.

  1. Enable .NET Framework Source debugging: Vermutlich ist der versuchte Schlüssel könnte in ähnlicher Weise für andere Wörterbuch Typen. Die Anweisungen scheinen immer noch gültig zu sein, obwohl sie für Visual Studio 2013 bestimmt sind. (NB. Ich musste den Symbolcache löschen.)

  2. Die Ausnahme (zumindest für diesen Code) wird bei the following line geworfen werden:

    throw new ArgumentException(Environment.GetResourceString(GetResourceName(resource))); 
    
  3. Backtracking eine Ebene nach oben in den Call-Stack zu this line, ich auf den folgenden Code-Block erhalten:

    for (int i = buckets[targetBucket]; i >= 0; i = entries[i].next) { 
        if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) { 
         if (add) { 
          ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate); 
         } 
    
  4. die meisten der lokalen Variablen sind nicht verfügbar - die Uhr und lokale Fenster geben die folgende Meldung:

    Der Wert der lokalen Variablen oder des lokalen Arguments kann nicht abgerufen werden, weil er an diesem Befehlszeiger nicht verfügbar ist, möglicherweise weil er entfernt wurde.

    Aber i ist verfügbar, und so ist entries. Der folgende Ausdruck in dem Überwachungsfenster gibt den doppelten Schlüssel:

    entries[i].key 
    
3

Ich glaube nicht, dass es möglich ist, diese Informationen von der Ausnahme mit dem aktuellen Desktop .NET Framework zu erhalten. (Obwohl Sie können do it in the debugger, wenn Sie bereit sind, durch einige Reifen zu springen.)

Die gute Nachricht ist, dass in .NET Core Sie tun den Schlüssel, um zu sehen zu bekommen, wie Sie, indem Sie die Quelle sehen Code:

Also auf .NET Kern am Ende mit einer Ausnahme, wie dies oben:

System.ArgumentException: An item with the same key has already been added. Key: x 

Ich glaube nicht, können Sie programmatisch die Schlüssel an dieser Stelle bestimmen, aber zumindest können Sie für das Debuggen sagen Zweck, vorausgesetzt, die Zeichenfolgendarstellung Ihres Schlüssels ist ausreichend detailliert.

Ich würde hoffen, dass es irgendwann in die Desktop-Version von .NET.

+0

[Es scheint möglich zu sein] (https://stackoverflow.com/a/44918884/111794), wenn .NET Framework Quelle Debuggen aktiviert. –

+0

@ZevSpitz: Danke, wird bearbeitet. –

Verwandte Themen