Передача `List` типов значений в метод, ожидающий` IEnumerable` ссылочных типов - PullRequest
0 голосов
/ 24 февраля 2020

Мне интересно, почему в. NET невозможно передать список типов значений методу, который ожидает IEnumerable ссылочных типов. Например,

void MyMethod(IEnumerable<object> items) {}
...
var dtList = new List<DateTime> { DateTime.Now };
MyMethod(dtList); // not possible, but it's possible to make a cast object o = DateTime.Now;

Поскольку это прекрасно работает для ссылочных типов, я пришел к выводу, что в случае типов значений бокс необходим для каждого элемента в коллекции и его может повлиять на производительность, но я могу ошибаться, и есть некоторые другие вещи, которые следует учитывать.

1 Ответ

2 голосов
/ 24 февраля 2020

Поскольку типы значений не являются ковариантными (их необходимо заключить в коробку), и поэтому они теряют свою идентичность , для которой компилятор получает указание сохранить по спецификациям. Но вы можете сыграть это .Cast<object>() (за счет бокса), что может или не может быть проблемой для вас.

Для получения более подробной информации о личность Вы можете увидеть блог Eri c Lipperts на Представление и идентичность

Все встроенные эталонные преобразования сохраняют идентичность. Вот почему ковариантные и контравариантные преобразования типов интерфейса и делегата требуют, чтобы все переменные аргументы типа имели ссылочные типы. Чтобы преобразование ссылки на вариант всегда сохраняло идентичность, все преобразования, включающие аргументы типа, также должны сохранять идентичность.

...