У меня создалось впечатление, что компилятор C# неявно введет массив, базирующийся от типа, в который они могут все быть неявно преобразованы.
Компилятор не генерирует лучшего типа, найденного для неявно-типизированного-массива
public interface ISomething {}
public interface ISomething2 {}
public interface ISomething3 {}
public class Foo : ISomething { }
public class Bar : ISomething, ISomething2 { }
public class Car : ISomething, ISomething3 { }
void Main()
{
var obj1 = new Foo();
var obj2 = new Bar();
var obj3 = new Car();
var objects= new [] { obj1, obj2, obj3 };
}
Я знаю, что способ исправить это состоит в том, чтобы объявить тип как:
new ISomething [] { obj1, ...}
Но я после под справкой типа покрытий здесь.
Компилятор C # рассматривает набор типов всех указанных элементов. Он не учитывает общие базовые типы и т. Д.
Вы могли бы привести одно из выражений:
var objects= new [] { obj1, obj2, (ISomething) obj3 };
... но лично я бы просто использовал явную форму:
var objects= new ISomething[] { obj1, obj2, obj3 };
В качестве альтернативы, если вы явно объявили некоторые или все из obj1
, obj2
и obj3
как тип ISomething
, это тоже подойдет без изменения выражения инициализации массива.
Из спецификации C # 3, раздел 7.5.10.4:
Выражение создания массива третья форма называется создание неявно типизированного массива выражение . Это похоже на вторая форма, за исключением того, что элемент тип массива явно не дано, но определено как лучший общий тип (§7.4.2.13) множества выражения в инициализаторе массива.
Раздел 7.4.2.13 выглядит так:
В некоторых случаях общий тип должен быть выведенным для набора выражений. В частности, типы элементов неявно типизированные массивы и возврат типы анонимных функций с таким образом обнаруживаются блочные тела.Интуитивно, учитывая набор выражения E1… Em этот вывод должен быть эквивалентен вызову метод
Tr M
(X x1… X xm) с Ei в качестве аргументов. Более именно вывод начинается с переменной нефиксированного типа X. Затем делается вывод о типе вывода. из каждого Ei с типом X. Наконец, X фиксирован, и результирующий тип S является получившийся общий тип для выражения.
Если все экземпляры могут быть приведены к типу любого одного экземпляра, то будет использоваться этот тип. Недостаточно, чтобы все экземпляры имели какой-либо общий тип, иначе инициализация массива имплицитности всегда будет успешной и часто будет генерировать нежелательные новые массивы object[]
.