Неявная типизация массивов та реализация интерфейсы

У меня создалось впечатление, что компилятор 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, ...} 

Но я после под справкой типа покрытий здесь.

9
задан GEOCHET 15 December 2013 в 20:55
поделиться

2 ответа

Компилятор 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 является получившийся общий тип для выражения.

14
ответ дан 4 December 2019 в 12:17
поделиться

Если все экземпляры могут быть приведены к типу любого одного экземпляра, то будет использоваться этот тип. Недостаточно, чтобы все экземпляры имели какой-либо общий тип, иначе инициализация массива имплицитности всегда будет успешной и часто будет генерировать нежелательные новые массивы object[].

3
ответ дан 4 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: