为什么LINQPad将枚举整数值转储为字符串?

Rya*_*yan 12 c# 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
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Tho*_*que 15

实际上,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);
    }
Run Code Online (Sandbox Code Playgroud)

如您所见,如果是sourceimplements IEnumerable<TResult>,Cast则只返回源不变.在这种情况下,source是类型Option[],碰巧实现IEnumerable<int>,所以Cast返回一个数组Option,LINQPad转储它.

我必须承认,它Option[]可以被投射到一个惊喜IEnumerable<int>,但似乎是这样的......

  • 它不能只被强制转换为`IEnumerable <int>` - 它可以强制转换为`int []`!这是CLR允许的转换,但是C#语言不...因此要使转换编译,你必须首先通过转换为`object`来混淆C#编译器......但是它可以正常工作. (3认同)