[Mono-bugs] [Bug 444778] New: Dictionary<K, V> cast as ICollection puts wrong values into array in CopyTo

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Thu Nov 13 14:31:40 EST 2008


https://bugzilla.novell.com/show_bug.cgi?id=444778


           Summary: Dictionary<K, V> cast as ICollection puts wrong values
                    into array in CopyTo
           Product: Mono: Class Libraries
           Version: 1.9
          Platform: Other
        OS/Version: Other
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: Sys.Core
        AssignedTo: jbevain at novell.com
        ReportedBy: jonbnews at hotmail.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---


If you cast a Dictionary<K, V> to a non-generic ICollection, and then call
CopyTo on that ICollection, it puts DictionaryEntry types into the array during
the copy.  I believe is should put KeyValuePair<K, V> types into the array.

Here's an example:

         Dictionary<string, int> dict = new Dictionary<string, int>();
         dict.Add("foo", 1);
         ICollection col = (ICollection) dict;
         foreach (object obj in col)
         {
            if (obj is KeyValuePair<string, int>)
            {
               Console.Out.WriteLine("KeyValuePair");
            }
         }

         object[] arr = new object[1];
         col.CopyTo(arr, 0);
         if (arr[0] is KeyValuePair<string, int>)
         {
            Console.Out.WriteLine("KeyValuePair");
         }

I would expect this to output "KeyValuePair" twice, but it only outputs it
once.  This seems cleary wrong.  If you iterate over the collection, you get
KeyValuePairs, but if you copy the collection to an array, you get something
else.

In the Dictionary.cs file, it's clear in the ICollection.CopyTo that it adds a
new DictionaryEntry to the array.  I think this should be a KeyValuePair. 
There's probably an opportunity for some simplification too, since then the
ICollection.CopyTo implementation becomes the same as
ICollection<KeyValuePair<K, V>>.CopyTo.  I suspect the
ICollection<KeyValuePair<K, V>>.CopyTo method could just be implemented by
calling:

((ICollection)this).CopyTo(...)


-- 
Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.


More information about the mono-bugs mailing list