求助: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
相关产品推荐
相关产品推荐

