Я пишу класс, который реализует интерфейсы ICollection<T>
и ICollection
.
MSDN говорит, что они немного разные. ICollection<T>.CopyTo
принимает аргумент T[]
, тогда как ICollection.CopyTo
принимает аргумент System.Array
. Существует также разница между исключениями.
Вот моя реализация универсального метода (я считаю, что он полностью функциональный):
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];
}
Однако, не общий вариант метода немного меня путает. Во-первых, , как я могу проверить следующее условие исключения?
Тип источника ICollection не может быть автоматически добавлен к типу целевого массива.
Во-вторых, существует ли способ использовать существующую общую реализацию, чтобы уменьшить дублирование кода?
Вот моя работа в процессе выполнения:
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);
}