Показанный сеанс отладки взят из примера программы, представленной на Как: реализовать шаблон потока данных производитель-потребитель.
Почему в System.Threading.Tasks.Dataflow стандартные типы блоков, такие как BufferBlock, реализованы с помощью списка, а не очереди? Большинство блоков потока данных (особенно BufferBlock<T>) предназначены для использования в качестве FIFO, но всплывающее начало списка - это O(n), а не O(1) для очереди. В основном мне любопытно, есть ли у кого-нибудь представление о возможном обосновании этого дизайна.





Никогда не делайте никаких выводов на основании сеанса отладки, сначала изучите источник.
Рассмотрим информацию о классе для BufferBlock<T>
public IEnumerable<T> Queue { get { return _sourceDebuggingInformation.OutputQueue; } }
Как видите, свойство Queue здесь происходит из поля отладочная информация.
Давайте посмотрим на класс:
internal IEnumerable<TOutput> OutputQueue { get { return _source._messages.ToList(); } }
Опять же, как вы можете видеть, это очередь на основе списка нет, это очередь, преобразуемая в список для отладка.
Наконец, давайте посмотрим, какой тип имеет поле _messages. Это SingleProducerSingleConsumerQueue<T>, который работает именно так, как должен.
Это не принудительное, это вычисляемое свойство, вы можете сделать это сами :) Если вы хотите понять внутреннюю структуру класса, вам следует изучить закрытые поля в отладчике.
Интересно. Впервые я когда-либо слышал, что отладчик можно заставить отображать тип, отличный от базовой переменной. Слишком много для изучения и слишком мало времени: /