Обозначение new []
предназначено для сохранения возможности вводить явный тип членов массива (или для создания массивов, где его элементы имеют анонимный тип), но вывод типа ограничен тем, что все элементы должны совместно использовать того же типа или быть неявно конвертируемым в общий тип, используемый по крайней мере одним членом. См. Спецификацию C #, раздел 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 []
, не означает, что он должен. С точки зрения компилятора, это было бы тривиальным выбором в крайнем случае, но, как мне кажется, очень нелогичным для разработчика.