【问题标题】:Replacing var with type name in Linq query在 Linq 查询中用类型名称替换 var
【发布时间】:2018-10-30 17:59:21
【问题描述】:

我有以下代码:

List<string> myCars = new List<string>()
    { "Mercury Cougar", "Dodge Dart", "Ford Taurus SHO",
      "Dodge Charger", "Chevrolet Blazer", "Dodge Neon" };

    var dodges = from someCars in myCars
                 where someCars.Contains("Dodge")
                 orderby someCars descending
                 select someCars;

Console.WriteLine(dodges.GetType()); //System.Linq.OrderedEnumerable`2[System.String,System.String]

dodges.GetType() 以 CIL 语法返回完全限定名称。

如果我将它翻译成 C# 并用它来替换 var,它不会编译:

类型或命名空间名称“OrderedEnumerable”不存在于 命名空间“System.Linq”(您是否缺少程序集引用?)

System.Linq.OrderedEnumerable<string, string> dodges = from someCars in myCars
                         where someCars.Contains("Dodge")
                         orderby someCars descending
                         select someCars;

这是因为OrderedEnumerable&lt;string, string&gt; 不可用,只有System.Linq.IOrderedEnumerable&lt;string&gt; 可用。

为什么OrderedEnumerable&lt;string, string&gt; 不可用?

【问题讨论】:

  • 这是IOrderedEnumerable&lt;string&gt;,而不是OrderedEnumerable&lt;string, string&gt;
  • "it doesn't compile" :始终在您的问题中包含错误消息。
  • 我打赌你也在寻找IOrderedEnumerable&lt;T&gt;OrderedEnumerable&lt;TElement, TKey&gt; 被声明为internal 并实现IOrderedEnumerable&lt;T&gt;,如here 所示。
  • @Backwards_Dave,正如其他人所指出的,OrderedEnumerable&lt;TElement, TKey&gt; 是一个 internal 类,它继承自内部 abstractOrderedEnumerable&lt;TElement&gt;,它实现IOrderedEnumerable&lt;TElement&gt; 接口。
  • 为什么 OrderedEnumerable 不可用 因为它是接口的“内部”实现。没有理由应该提供或记录它。使用 LINQ,您应该针对接口(@98​​7654341@、IOrderedEnumerable&lt;&gt;IQueryableIQueryable&lt;&gt;)进行编程

标签: c# linq var


【解决方案1】:

为什么OrderedEnumerable&lt;string, string&gt;不可用

因为它是接口的“内部”实现。没有理由为什么它应该可用或记录在案。使用 LINQ,您应该针对接口(@98​​7654323@、IOrderedEnumerable&lt;&gt;IQueryable&lt;&gt;...)进行编程

如果您看一下,所有 LINQ 方法都会返回一个派生自其中一个接口的内部类,并且它们通常可以返回多个不同类的实例,具体取决于输入。例如,Enumerable.Select() 可以返回 new SelectListIterator&lt;TSource, TResult&gt;SelectIListIterator&lt;TSource, TResult&gt;new SelectIPartitionIterator&lt;TSource, TResult&gt; 或各种其他类,具体取决于 IEnumerable&lt;&gt; 输入的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 2011-08-14
    • 2021-12-26
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多