Ответ 1
Обозначение new []
предназначено для того, чтобы вы могли вводить явный тип членов массива (или позволять создавать массивы, где его элементы имеют анонимный тип), но его вывод типа ограничен тем, что все элементы должны совместно использовать такого же типа или быть неявно конвертируемым в общий тип, совместно используемый хотя бы одним членом. См. Спецификация С#, раздел 7.6.10.4:
Выражение для создания массива третьей формы называется выражением создания неявно типизированного массива. Он похож на вторую форму, за исключением того, что тип элемента массива явно не указан, но определяется как наилучший общий тип (§7.5.2.14) набора выражений в инициализаторе массива.
Ниже приведены примеры неявно типизированных выражений создания массива:
var a = new[] { 1, 10, 100, 1000 }; // int[] var b = new[] { 1, 1.5, 2, 2.5 }; // double[] var c = new[,] { { "hello", null }, { "world", "!" } }; // string[,] var d = new[] { 1, "one", 2, "two" }; // Error
Последнее выражение вызывает ошибку времени компиляции, так как ни
int
, ниstring
неявно конвертируется в другую, и поэтому нет лучшего общего типа. В этом случае должно использоваться явно созданное выражение для создания массива, например, указывая типobject[]
. В качестве альтернативы, один из элементов может быть перенесен на общий базовый тип, который затем станет типом предполагаемого элемента.
Ключевым моментом здесь является то, что "лучший общий тип" может быть только одним из уже существующих типов. Как сказал Damien_The_Unbeliever в комментарии: "Поскольку мистер Липперт любит указывать вокруг вывода, всякий раз, когда он ищет лучший общий тип, он будет возвращать только один из типы, которые уже присутствуют, - он не идет на охоту за наиболее распространенным общим предком".
Просто потому, что каждый массив может быть object []
не означает, что он должен. С точки зрения компилятора, который был бы тривиальным выбором последнего курорта, но, я думаю, очень интуитивно понятный для разработчика.