我在下面的代码中简化并重现了我的问题。我收到的错误是:参数 1:无法从“System.Collections.ObjectModel.Collection”转换为“System.Collections.ObjectModel.Collection”
导致此问题的设计决策的一些背景:我创建了一个用于处理“IFruit”的 Web 服务,但由于 SOAP 的性质和我理解的端点绑定(bind),我创建了具有显式实现的方法水果。在业务层,为水果的每个具体实现创建一个单独的方法,首先会导致大量重复代码,其次业务层和服务层耦合得足够紧密,以至于以后在 web 服务中接受新的 IFruit 类型也需要更改我的代码在业务层(添加另一份冗余代码)。这种设计是我过去使用 Java 成功实现的设计,但 C# 接口(interface)似乎完全不同,足以让我失望。请指教。
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);
}
最佳答案
尝试更改您的 EatFruit
接受方法IEnumerable<IFruit>
public void EatFruit(IEnumerable<IFruit> fruits)
{
foreach (var fruit in fruits)
{
Console.WriteLine(fruit.TakeBite());
}
}
界面IEnumerable<out T>
支持协方差,因为它标有 out
修饰符。 Collection<T>
没有标有这样的修饰符。
关于C# 将集合作为接口(interface)集合传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11367341/