This won't compile even Autobot implements ITransformer:

Can fix it with ToList, but it's an expensive operation, as it creates a copy:
public static List<ITransformer> GetTransformers(TransformerType t) { if (t == TransformerType.Autobot) return GetAutobots().ToList<ITransformer>(); else if (t == TransformerType.Decepticon) return GetDecepticons().ToList<ITransformer>(); return null; }
To cut to the chase, return the List<ConcreteClass> to IEnumerable<Interface>:
public static IEnumerable<ITransformer> GetTransformersOop(TransformerType t) { if (t == TransformerType.Autobot) return GetAutobots(); else if (t == TransformerType.Decepticon) return GetDecepticons(); return null; }
Live code: https://dotnetfiddle.net/K3IcR5
For further information why List<ConcreteClass> is not compatible to List<Interface> even the concrete class implements the interface, read about covariance
No comments:
Post a Comment