12

I was using LinqPad to test out some Enum functions and I didn't get integers like I expected when I used .Dump(). Why did the ToList() solve the problem?

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

Ryan
  • 4,602
  • 8
  • 37
  • 43
  • i think this is a limitation of the `.Cast` operation. `Enum.GetValues(typeof(Options)).Cast().Select(f => (int)f).Dump();` works for me. – Daniel A. White Apr 24 '14 at 18:44

1 Answers1

15

Actually, LINQPad is not the culprit here. This is because of an optimization in 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);
    }

As you can see, if source implements IEnumerable<TResult>, then Cast just returns the source unchanged. In this case, source is of type Option[], which happens to implement IEnumerable<int>, so Cast returns an array of Option, and LINQPad dumps it.

I must admit that it came as a surprise that Option[] can be cast to IEnumerable<int>, but it seems to be the case...

Thomas Levesque
  • 286,951
  • 70
  • 623
  • 758
  • 3
    It can't just be cast to `IEnumerable` - it can be cast to `int[]`! This is a conversion that the CLR allows, but the C# language doesn't... so to make the cast compile, you have to confuse the C# compiler by converting to `object` first... but then it works fine. – Jon Skeet Apr 24 '14 at 18:56
  • @JonSkeet, I assume that it works only because the underlying type of that enum is int? – Thomas Levesque Apr 24 '14 at 18:57
  • Yup. Although you could cast to `uint[]` as well. The CLR is quite forgiving when it comes to conversions like that. – Jon Skeet Apr 24 '14 at 18:57