I'm writing a class that implements ICollection<T> and ICollection interfaces.
MSDN says these are a bit different. ICollection<T>.CopyTo takes a T[] argument, whereas ICollection.CopyTo takes a System.Array argument. There is also a difference between exceptions thrown.
Here is my implementation of the generic method (I believe it's fully functional):
void ICollection<PlcParameter>.CopyTo(PlcParameter[] array, int arrayIndex)
{
    if (array == null)
        throw new ArgumentNullException("array");
    if (arrayIndex < 0)
        throw new ArgumentOutOfRangeException("arrayIndex");
    if (array.Length - arrayIndex < Count)
        throw new ArgumentException("Not enough elements after arrayIndex in the destination array.");
    for (int i = 0; i < Count; ++i)
        array[i + arrayIndex] = this[i];
}
However, the non-generic version of the method is confusing me a bit. First, how do I check for the following exception condition?
The type of the source ICollection cannot be cast automatically to the type of the destination array.
Second, is there a way to leverage the existing generic implementation to reduce code duplication?
Here is my work-in-progress implementation:
void ICollection.CopyTo(Array array, int index)
{
    if (array == null)
        throw new ArgumentNullException("array");
    if (index < 0)
        throw new ArgumentOutOfRangeException("arrayIndex");
    if (array.Rank > 1)
        throw new ArgumentException("array is multidimensional.");
    if (array.Length - index < Count)
        throw new ArgumentException("Not enough elements after index in the destination array.");
    for (int i = 0; i < Count; ++i)
        array.SetValue(this[i], i + index);
}
 
     
    