在LINQ的Select()中返回不同子类型的优雅实现方式
解决方法
1. 显式指定Select的泛型参数
这是最直接清晰的方式,通过明确声明Select的输入元素类型和返回类型(Base),让编译器无需自行推断:
// 把MyObject替换成myObjects实际的元素类型即可 IEnumerable<Base> foo = myObjects.Select<MyObject, Base>(o => { if(o.SomeProperty){ return new A(); } else { return new B(); } });
2. 仅对单个分支做显式向上转型
子类可以隐式转换为基类,只要让编译器看到其中一个分支的返回类型是Base,另一个分支的子类会自动完成隐式转换,无需两个分支都处理:
IEnumerable<Base> foo = myObjects.Select(o => { if(o.SomeProperty){ return (Base)new A(); // 仅此处显式转换 } else { return new B(); // 编译器自动将B隐式转为Base } });
3. 简化as转换写法(可选)
如果偏好as语法,也可以只在一个分支使用,效果和上面一致:
IEnumerable<Base> foo = myObjects.Select(o => { if(o.SomeProperty){ return new A() as Base; } else { return new B(); } });
其中第一种方法可读性最高,通过泛型参数直接声明返回类型,完全避免了额外的转换操作,是最优解。
内容的提问来源于stack exchange,提问作者Master_T
相关产品推荐
相关产品推荐

