You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:50:33