Вот пример кода для обсуждения (см. "Рептилия" - "Животное и млекопитающее" - это "Животное тоже" )
Animal[] reptiles = new Reptile[]
{ new Reptile("lizard"), new Reptile("snake") };
Animal[] animals = new Animal[]
{ new Reptile("alligator"), new Mammal("dolphin") };
try
{
Array.ConstrainedCopy(animals, 0, reptiles, 0, 2);
}
catch (ArrayTypeMismatchException atme)
{
Console.WriteLine('[' + String.Join<Animal>(", ", reptiles) + ']');
}
Когда я запускаю этот код, я получаю исключение ArrayTypeMismatchException, с комментарием
Array.ConstrainedCopy будет работать только с типами массивов, которые предположительно совместимый, без какой-либо формы бокса, распаковки, расширения или литья каждого элемента массива. Измените типы массивов (т.е. Скопируйте Derived [] на базу []) или использовать стратегию смягчения в CER для Array.Copy's менее мощный контракт на надежность, например, клонирование массива или отбрасывая потенциально поврежденный целевой массив.
Однако, когда я смотрю MSDN, я вижу, что этот метод также генерирует InvalidCastException
. Условие throw InvalidCastException
:
По крайней мере один элемент в sourceArray не может быть отнесен к типу destinationArray.
Итак, я в тупике, как вы получаете InvalidCastException из этого метода, если в нем указано, что никогда не может быть никакого литья элемента массива?