C# 为什么可以';当我的类实现IEnumerable时,我使用LINQ to对象<;T>;多次?

C# 为什么可以';当我的类实现IEnumerable时,我使用LINQ to对象<;T>;多次?,c#,ienumerable,linq-to-objects,C#,Ienumerable,Linq To Objects,我有一个有趣的问题,一个类继承了一个实现IEnumerable的类,但我也希望该类为不同的类型实现IEnumerable。除了IEnumerable扩展方法外,其他方法都可以工作,这意味着在默认情况下,如果不总是先强制转换,我就不能对对象执行任何LINQ。除了不断施展之外,还有人有什么想法吗 using System; using System.Collections.Generic; using System.Linq; namespace LinqTesting { public

我有一个有趣的问题,一个类继承了一个实现IEnumerable的类,但我也希望该类为不同的类型实现IEnumerable。除了IEnumerable扩展方法外,其他方法都可以工作,这意味着在默认情况下,如果不总是先强制转换,我就不能对对象执行任何LINQ。除了不断施展之外,还有人有什么想法吗

using System;
using System.Collections.Generic;
using System.Linq;

namespace LinqTesting
{
    public class Trucks<T> : Vehicles, IEnumerable<Truck>
    {    
        public Trucks()
        {    
            // Does Compile
            var a = ((IEnumerable<Truck>)this).FirstOrDefault();
            // Doesn't Compile, Linq.FirstOrDefault not found
            var b = this.FirstOrDefault();
        }    

        public new IEnumerator<Truck> GetEnumerator() { throw new NotImplementedException(); }
    }    

    public class Vehicles : IEnumerable<Vehicle>
    {    
        public IEnumerator<Vehicle> GetEnumerator() { throw new NotImplementedException(); }
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { throw new NotImplementedException(); }
    }    

    public class Vehicle { }

    public class Truck : Vehicle { }
}     
使用系统;
使用System.Collections.Generic;
使用System.Linq;
名称空间LinqTesting
{
公共级卡车:车辆,IEnumerable
{    
公共卡车()
{    
//编译
var a=((IEnumerable)this.FirstOrDefault();
//未编译,未找到Linq.FirstOrDefault
var b=this.FirstOrDefault();
}    
public new IEnumerator GetEnumerator(){throw new NotImplementedException();}
}    
公共类车辆:IEnumerable
{    
公共IEnumerator GetEnumerator(){抛出新的NotImplementedException();}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator(){抛出新的NotImplementedException();}
}    
公共类车辆{}
公共类卡车:车辆{}
}     

< /代码> 实现iQuestabyMultTimeDebug编译程序,编译器对此应加以考虑。
IEnumerable<Vehicle> or IEnumerable<Truck>?

this.FirstOrDefault<Truck>() might compile. 
IEnumerable还是IEnumerable?
可能会编译此.FirstOrDefault()。
公共新IEnumerator GetEnumerator()

该行中的
new
关键字隐藏了从Vehicle类继承的GetEnumerator()方法。我不确定这是否可行,但或许可以尝试一下。

将代码更改为:

public class Trucks : Vehicles<Truck>
{    
}    

public class Vehicles<T> : IEnumerable<T>
    where T : Vehicle
{    
}    

public class Vehicle { }

public class Truck : Vehicle { }
公共级卡车:车辆
{    
}    
公共类车辆:IEnumerable
式中T:车辆
{    
}    
公共类车辆{}
公共类卡车:车辆{}

实际上您可以,但您不能利用泛型类型推断,因为您的类实现了两种不同类型的
IEnumerable
,编译器无法知道您要使用哪种类型

您可以直接指定它,如:

var b = this.FirstOrDefault<Truck>();
var b=this.FirstOrDefault();

看起来你有点被卡住了。这里有一个减少打字的建议。您可以为一些常用的IEnumerable类型创建扩展方法

var a=myList.AsTruckEnumerable().FirstOrDefault();
公共静态部分类扩展
{
公共静态IEnumerable Astrucknumerable(此IEnumerable卡车)
{
返回卡车;
}
}
公共级卡车:车辆,IEnumerable
{    
公共卡车()
{    
//编译
var a=((IEnumerable)this.FirstOrDefault();
//编译
var b=this.AsTruckEnumerable().FirstOrDefault();
//未编译,未找到Linq.FirstOrDefault
//var b=this.FirstOrDefault();
}    
public new IEnumerator GetEnumerator(){throw new NotImplementedException();}
}    

卡车对象不是继承了两种IEnumerable类型吗?您希望编译器如何找到您想要使用的可枚举类型,尝试向上转换到您想要的类型,然后选择FirstOrDefaults不幸的是,我没有访问基类代码的权限,但这将是正确的解决方案。我得看看能不能换一下。谢谢这真的是我错过的。这是令人困惑的,因为intellisense会弹出显示方法,但它也会在同一行中显示错误,因为编译器无法再利用泛型类型推断。对某些接口使用显式接口实现,而对其他接口使用隐式接口实现,不会改变扩展方法的分辨率。只有当您直接调用
GetEnumerator()
时,它才有帮助,所以这没有帮助。
var a = myList.AsTruckEnumerable().FirstOrDefault();

public static partial class Extensions
{
  public static IEnumerable<Truck> AsTruckEnumerable (this IEnumerable<Truck> trucks)
  {
     return trucks;
  }
}

public class Trucks<T> : Vehicles, IEnumerable<Truck>
{    
   public Trucks()
   {    
      // Does Compile
      var a = ((IEnumerable<Truck>)this).FirstOrDefault();

      // Does compile
      var b = this.AsTruckEnumerable().FirstOrDefault();
      // Doesn't Compile, Linq.FirstOrDefault not found
      //var b = this.FirstOrDefault();
   }    

   public new IEnumerator<Truck> GetEnumerator() { throw new NotImplementedException(); } 
}