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

求助:C#7.3中LINQ目标类型条件表达式不可用的解决方案

问题解决方案

错误原因

CS8400错误是因为你使用的C#7.3不支持目标类型条件表达式特性。该特性在C#9及以上版本才引入,允许编译器根据赋值目标的类型(这里是IDbRoute)自动统一条件运算符?:两个分支的类型。而C#7.3要求?:的两个操作数必须能直接推断出公共类型,不能依赖目标变量的类型。

可行解决方案

方案1:显式转换其中一个分支到IDbRoute

通过强制转换其中一个子类实例为接口类型,让编译器明确两个分支的公共类型是IDbRoute:

return repo.Find() // Proprietary method returning IQueryable<T>
    .Select(x => new PostSnippet
    {
        Route = x.HasParams
        ? (IDbRoute)new DynamicDbRoute {
            // 填充DynamicDbRoute的属性
        }
        : new StaticDbRoute {
            // 填充StaticDbRoute的属性
        },
        // 填充PostSnippet的其他属性
    });

方案2:使用局部变量明确类型

先创建一个IDbRoute类型的局部变量,再赋值给PostSnippet.Route,这样编译器能清晰推断类型:

return repo.Find()
    .Select(x => 
    {
        IDbRoute route = x.HasParams
            ? new DynamicDbRoute { /* 填充属性 */ }
            : new StaticDbRoute { /* 填充属性 */ };
        
        return new PostSnippet
        {
            Route = route,
            // 填充PostSnippet的其他属性
        };
    });

注意事项

如果你的LINQ查询最终要转换为SQL执行(EF的IQueryable特性),需要确保自定义类型的构造和赋值操作能被EF解析。如果EF无法解析这些操作,可能需要先调用AsEnumerable()将查询转换为内存中的LINQ to Objects操作,但这会将所有匹配数据加载到内存中,需要根据数据量权衡性能。

改进建议

如果后续项目允许升级框架,可以考虑升级到.NET 5或更高版本(对应C#9+),此时你的原始代码写法就会被编译器支持,无需额外转换。

内容的提问来源于stack exchange,提问作者John Ohara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 09:57:18