C#将集合作为接口集合传递

You*_*ava 9 c# collections interface decoupling

我在下面的代码中简化并重现了我的问题.我收到的错误是:参数1:无法从'System.Collections.ObjectModel.Collection'转换为'System.Collections.ObjectModel.Collection

导致这个问题的设计决策的一些背景:我已经创建了一个用于处理"IFruit"的Web服务,但由于我理解它们的SOAP和端点绑定的性质,我已经创建了具有IFruit的显式实现的方法.在业务层,为每个特定的水果实现创建一个单独的方法首先会导致大量重复的代码,其次紧密地结合业务和服务层,以便稍后在Web服务中接受新的IFruit类型也需要更改我的代码在业务层(添加冗余代码的另一个副本).这个设计是我过去使用Java成功实现的设计,但C#接口似乎只是与我不同.请指教.

public interface IFruit{
    public string TakeBite();
}

public Apple : IFruit{
    public string TakeBite(){
        return "tasty bite of apple";
    }
}

public void EatFruit(Collection<IFruit> fruits){
    foreach(var fruit in fruits){
        Console.WriteLine(fruit.TakeBite());
    }
}

public void EatApples(Collection<Apple> apples){
    this.EatFruit(apples);
}
Run Code Online (Sandbox Code Playgroud)

Kev*_*mey 9

尝试更改您的EatFruit方法以接受IEnumerable<IFruit>

public void EatFruit(IEnumerable<IFruit> fruits)
{
    foreach (var fruit in fruits)
    {
        Console.WriteLine(fruit.TakeBite());
    }
}
Run Code Online (Sandbox Code Playgroud)

界面IEnumerable<out T>支持协方差,因为它用out修饰符标记. Collection<T>没有标记这样的修饰符.