小编Ste*_*eve的帖子

当模糊地使用IEnumerable时,Linq函数会给出奇怪的编译错误 - 可能的解决方法?

给定类似于以下的代码(在实际用例中实现):

class Animal
{
  public bool IsHungry { get; }
  public void Feed() { }
}
class Dog : Animal
{
  public void Bark() { }
}

class AnimalGroup : IEnumerable<Animal>
{
  public IEnumerator<Animal> GetEnumerator() { throw new NotImplementedException(); }
  IEnumerator IEnumerable.GetEnumerator() { throw new NotImplementedException(); }
}

class AnimalGroup<T> : AnimalGroup, IEnumerable<T>
  where T : Animal
{
  public new IEnumerator<T> GetEnumerator() { throw new NotImplementedException(); }
}
Run Code Online (Sandbox Code Playgroud)

一切都很好用一个普通的foreach ...例如以下编译好:

var animals = new AnimalGroup();
var dogs = new AnimalGroup<Dog>(); …
Run Code Online (Sandbox Code Playgroud)

c# linq generics ienumerable

10
推荐指数
2
解决办法
211
查看次数

错误的重载导致编译器错误

使用VS2013,在下面的示例中,在尝试将函数传递给worker的构造函数时会给出两个不同的错误,但是,具有相同原型的lambda函数是可以的.

我做错了什么,如何更改GetA函数的定义以允许它被传递?

为了避免因误解类继承如何工作而引起的类似问题的混淆,我在这个例子中故意避免任何继承.

WorkerA只能接受Func<A>它的构造函数. WorkerAorB更灵活,可以接受a Func<A>或a Func<B>. WorkerAandB是最有能力的,可以接受a Func<A>和a Func<B>同时(或者任何一个).它最接近我的真实代码.

但是,当管理器中的代码尝试实例化工作程序时,WorkerA按预期工作,但WorkerAorB会给出错误:

错误CS0121:以下方法或属性之间的调用不明确:'WorkerAorB.WorkerAorB(System.Func <A>)'和'WorkerAorB.WorkerAorB(System.Func <B>)'

WorkerAandB

错误CS0407:'ManagerA.GetA()'的返回类型错误

在每种情况下,似乎编译器在传递对实际函数的引用而不是lambda或现有Func<A>变量时,无法确定要使用哪个重载,并且在WorkerAandB明确选择WRONG重载的情况下,给出关于传递函数的返回类型的错误.

class A { }
class B { }

class WorkerA
{
  public WorkerA(Func<A> funcA) { }
}

class WorkerAorB
{
  public WorkerAorB(Func<A> funcA) { }
  public WorkerAorB(Func<B> funcB) { }
}

class WorkerAandB
{
  public WorkerAandB(Func<A> funcA, Func<B> funcB = null) { } …
Run Code Online (Sandbox Code Playgroud)

c# lambda member-functions overload-resolution

9
推荐指数
1
解决办法
633
查看次数