C# 为什么可以';当我的类实现IEnumerable时,我使用LINQ to对象<;T>;多次?
我有一个有趣的问题,一个类继承了一个实现IEnumerable的类,但我也希望该类为不同的类型实现IEnumerable。除了IEnumerable扩展方法外,其他方法都可以工作,这意味着在默认情况下,如果不总是先强制转换,我就不能对对象执行任何LINQ。除了不断施展之外,还有人有什么想法吗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
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(); }
}