Почему LINQPad выдает перечисление целочисленных значений в виде строк?

Я использовал LinqPad для проверки некоторых функций Enum, и я не получал целые числа, как я ожидал, когда использовал .Dump(). Почему ToList() решил проблему?

void Main()
{
    Enum.GetValues(typeof(Options)).Cast<int>().Dump();
    Enum.GetValues(typeof(Options)).Cast<int>().ToList().Dump();
}

public enum  Options 
{
   Equal,
   LessThan,
   GreaterThan
}

enter image description here

Ответ 1

На самом деле LINQPad не является виновником. Это связано с оптимизацией в Enumerable.Cast:

    public static IEnumerable<TResult> Cast<TResult>(this IEnumerable source) {
        IEnumerable<TResult> typedSource = source as IEnumerable<TResult>;
        if (typedSource != null) return typedSource;
        if (source == null) throw Error.ArgumentNull("source");
        return CastIterator<TResult>(source);
    }

Как вы можете видеть, если source реализует IEnumerable<TResult>, то Cast просто возвращает исходный код без изменений. В этом случае source имеет тип Option[], который реализует IEnumerable<int>, поэтому Cast возвращает массив Option, а LINQPad выгружает его.

Я должен признать, что неожиданным было то, что Option[] можно отнести к IEnumerable<int>, но, похоже, это так...