【问题标题】:Why does LINQPad dump enum integer values as strings?为什么 LINQPad 将枚举整数值转储为字符串?
【发布时间】:2014-04-25 02:52:21
【问题描述】:

我使用 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
}

【问题讨论】:

  • 我认为这是.Cast 操作的限制。 Enum.GetValues(typeof(Options)).Cast&lt;int&gt;().Select(f =&gt; (int)f).Dump(); 为我工作。

标签: c# linqpad


【解决方案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&lt;TResult&gt;,那么Cast 只是返回源代码不变。在本例中,source 的类型为 Option[],恰好实现了IEnumerable&lt;int&gt;,因此Cast 返回一个Option 数组,LINQPad 将其转储。

我必须承认,Option[] 可以转换为 IEnumerable&lt;int&gt; 令人惊讶,但似乎确实如此......

【讨论】:

  • 它不能只转换为IEnumerable&lt;int&gt; - 它可以转换为int[]!这是 CLR 允许的转换,但 C# 语言不允许...所以要使强制转换编译,您必须先转换为 object 来混淆 C# 编译器...但是它可以正常工作。
  • @JonSkeet,我认为它之所以有效,是因为该枚举的基础类型是 int?
  • 是的。尽管您也可以转换为uint[]。对于这样的转换,CLR 非常宽容。
猜你喜欢
  • 2014-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多