Это на самом деле сбивает с толку.
Когда вы говорите object[] objs = new string[4] {};
, тогда objs
- это на самом деле массив строк . Небезопасная ковариация массива небезопасна, потому что система типов обманывает вас . Вот почему это небезопасно . Вы думаете , что ваш массив может содержать целое в штучной упаковке, но это действительно массив строк, и он не может содержать ничего, кроме строк .
Ваш вопрос: «почему это небезопасно?», И затем вы приводите пример того, почему это небезопасно. Это небезопасно, потому что происходит сбой во время выполнения, когда вы делаете что-то, что выглядит как безопасное . Это нарушение самого основного правила системы типов: переменная на самом деле содержит значение типа переменной.
Для переменной типа object
это не ложь. Вы можете хранить любой объект в этой переменной, так что это безопасно. Но переменная типа object[]
является ложью. В этой переменной можно хранить вещи, которые не object[]
.
Это, на мой взгляд, худшая особенность C # и CLR. C # имеет эту функцию, потому что CLR имеет это. У CLR есть это, потому что у Java есть это, и разработчики CLR хотели иметь возможность реализовать Java-подобные языки в CLR. Я не знаю, почему у Java это есть; это ужасная идея, и им не следовало этого делать.
Теперь понятно?